题意: 求Fibonacci数列的 F(ab)%n
规模:
- 0≤a,b<264
- 1≤n≤1000
类型: 数论,模运算
分析:
- 由Fibonacci数列的递推方式可得,取模之后,如果相邻两个数重复,那么数列循环,而相邻两数组合最多 n2 ,所以必定循环。
- 找到循环节Loop,计算 F((a%loop)b%loop)%n
时间复杂度&&优化:
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
typedef unsigned long long LL;
const int MAXN = 1100*1100;
//返回a^p mod n 要求0<=a<n
LL pow_mod(LL a,LL p,LL n){
if(p==0) return 1;
LL ans=pow_mod(a,p/2,n);
ans=ans*ans%n;
if(p%2==1)ans=ans*a%n;
return ans;
}
LL Fibo[MAXN];
LL loop=1;
void Fibonacci(int N){
Fibo[0]=0;
Fibo[1]=1;
for(int i=0;;i++){
Fibo[i+2]=(Fibo[i+1]+Fibo[i])%N;
if(Fibo[i+1]==0&&Fibo[i+2]==1){loop=i+1;break;}
}
}
int T;
LL m,a,b;
int n;
int main()
{
cin>>T;
while(T--){
cin>>a>>b>>n;
if(n==1){cout<<0<<endl;continue;}
Fibonacci(n);
int x=(int)pow_mod(a%loop,b,loop);
cout<<Fibo[x]%n<<endl;
}
return 0;
}