// UVa 10229 - Modular Fibonacci
// Fib(m+n) = Fib(m+1)*Fib(n) + Fib(m)*Fib(n-1)
#include <iostream>
#include <math.h>
#include <map>
using namespace std;
#define integer unsigned long long int
integer n, m;
map<integer, integer> memo;
integer mod(integer x) {
return x % m;
}
integer fib(integer n) {
if (n <= 1)
return n;
if (memo[n] != 0)
return memo[n];
integer sol = 0;
if (n & 1) {
integer Fn = fib(n >> 1);
integer Fn1 = fib((n >> 1) + 1);
sol = mod(mod(Fn * Fn) + mod(Fn1 * Fn1));
} else {
integer Fn = fib(n >> 1);
integer Fn1 = fib((n >> 1) - 1);
sol = mod(Fn * mod(Fn + mod(2 * Fn1)));
}
memo[n] = sol;
return sol;
}
int main() {
while (cin >> n >> m) {
m = (1 << m);
memo.clear();
cout << fib(n) << endl;
}
return 0;
}
Tuesday, June 23, 2015
UVa 10229 - Modular Fibonacci
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment