题目:
The i’th Fibonacci number f(i) is recursively defined in the following way:
• f(0) = 0 and f(1) = 1
• f(i + 2) = f(i + 1) + f(i) for every i ≥ 0 Your task is to compute some values of this sequence.
Input
Input begins with an integer t ≤ 10, 000, the number of test cases. Each test case consists of three integers a, b, n where 0 ≤ a, b < 2 64 (a and b will not both be zero) and 1 ≤ n ≤ 1000.
Output
For each test case, output a single line containing the remainder of f(a b ) upon division by n.
Sample Input
3
1 1 2
2 3 1000
18446744073709551615 18446744073709551615 1000
Sample Output
1
21
250
题意:
f[0] = 1, f[1] = 1; 给定一个n,求f[a^b]%n的结果。a,b达到2^64 - 1大。
代码:
#include <iostream>
using namespace std;
typedef unsigned long long ULL;
const int N = 1000;
int fib[N * N];
ULL quickmod(ULL x, ULL n, ULL m)
{
ULL result = 1;
for(; n; n>>=1)
{
if(n & 1)
{
result *= x;
result %= m;
}
x *= x;
x %= m;
}
return result;
}
int main()
{
int t;
cin>>t;
while(t--)
{
ULL a, b;
int n, M = 2;
cin>>a>>b>>n;
fib[0] = 0;
fib[1] = 1 % n;
for(int i=2; i<=n * n; i++)
{
fib[i] = (fib[i - 2] + fib[i - 1]) % n; //打表n*n的斐波那契数列
if(fib[i - 2] == 1 && fib[i - 1] == 0) //打表之后求循环节
{
M = i - 1;
break;
}
}
int k = quickmod(a % M, b, M); //快速幂取模
cout<<fib[k]<<endl;
}
return 0;
}