像刘汝佳书上说的,斐波那契数有一个叫尾数循环的性质:个位数是一个60步的循环,最后两位数是一个300步的循环。。。但是不会超过n^2;感兴趣的朋友可以查一查。
所以问题就变成了求a^b这个超大的数mod n等于多少,也就是所谓的幂取模利用递归,将大数分解取模;
但是要注意,0对任何数取模都是0,任何数对1取模都是0;
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ULL; const int maxn = 1000000+10; int f[maxn],kase; int pow_mod(ULL a,ULL n,int m) { if(n==0) return 1; ULL x=pow_mod(a,n/2,m); ULL ans = (ULL)x * x % m; if(n%2==1) ans = ans*a%m; return (int )ans; } int solve(ULL a,ULL b,int n) { if(a==0||n==1) return 0; for(int i=2;;i++){ f[i]=f[i-1]+f[i-2]; f[i]=f[i]%n; if(f[i-1]==0&&f[i]==1) { kase=i-1;break; } } int v=pow_mod(a%kase,b,kase); return f[v]; } int main() { int t,n; ULL a,b; scanf("%d",&t); while(t--) { cin>>a>>b>>n; f[0]=0; f[1]=1; printf("%d\n",solve(a,b,n)); } return 0; }
时间: 2024-12-28 21:33:34