寻找循环节,对于斐波那契的每一个数,都不相同,而在mod n之后,最坏第n次出现与之前的相同。
而当我们找到第二次0,1出现的位置时,就得到了循环节。最坏
n
2
n^2
n2次出现。
最后输出
a
b
a^b
ab%m的位置对应的值。
当n等于1时,输出0,此时f[]为全0;
注意爆long long.
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const int mod = 19260817;
const int N = 1e6+10;
int f[N];
int qmi(int a,unsigned long long b,int p){
int res = 1 % p;
while(b){
if(b & 1) res = res * a % p;
a = a*a % p;
b >>= 1;
}
return res;
}
signed main(){
IOS
#ifdef ddgo
freopen("C:\\Users\\asus\\Desktop\\ddgoin.txt","r",stdin);
#endif
int tt; cin>>tt;
while(tt --){
unsigned long long a,b;
int n,m = 0; cin>>a>>b>>n;
f[0] = 0,f[1] = 1;
if(n == 1){
cout<<0<<endl;
continue;
}
for(int i=2;;i++){
f[i] = (f[i-1] + f[i-2]) % n;
if(f[i] == 1 && f[i-1] == 0){
m = i - 1;
break;
}
}
int t = qmi(a%m,b,m);
cout<<f[t]<<endl;
}
return 0;
}