Discussion
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
题意
输入三个非负整数a,b,n;计算 f(ab)modn
思路
刘大爷的数316页,自己对这道题没想法
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 1000 + 5;
typedef unsigned long long ULL;
int f[maxn][maxn*6], period[maxn];
ULL pow_mod(ULL a, ULL b, int n) {
if(!b) return 1;
ULL k = pow_mod(a, b/2, n);
k = k * k % n;
if(b % 2) k = k * a % n;
return k;
}
int solve(ULL a, ULL b, int n) {
if(a == 0 || n == 1) return 0; // attention!
int p = pow_mod(a % period[n], b, period[n]);
return f[n][p];
}
int main() {
for(int n = 2; n <= 1000; n++) {
f[n][0] = 0; f[n][1] = 1;
for(int i = 2; ; i++) {
f[n][i] = (f[n][i-1] + f[n][i-2]) % n;
if(f[n][i-1] == 0 && f[n][i] == 1) {
period[n] = i - 1;
break;
}
}
}
ULL a, b;
int n, T;
cin >> T;
while(T--) {
cin >> a >> b >> n;
cout << solve(a, b, n) << "\n";
}
return 0;
}