链接:https://www.nowcoder.com/acm/contest/93/K
来源:牛客网
题目描述
wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2)
一天他突发奇想,想求F(a^b)%c
输入描述:
输入第一行一个整数T(1<=T<=100),代表测试组数
接下来T行,每行三个数 a,b,c (a,b<=2^64) (1<c<1000)
输出描述:
输出第a^b项斐波那契数对c取余的结果
示例1
输入
3 1 1 2 2 3 1000 32122142412412142 124124124412124 123
输出
1 21 3
这题超级超级坑爹 ,专门卡着long long ,要用unsigned long long ,
由于这个原因我卡了好久好久。
这个题目不断的取模,会使得斐波那契数列形成一个环.
然后就是一个快速幂取模。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 #define ll long long 5 #define llu unsigned long long 6 const int maxn=1e5+10; 7 8 llu f[maxn]; 9 llu modexp(llu a,llu b,llu c) 10 { 11 llu res=1,temp=a%c; 12 while(b){ 13 if (b&1) res=res*temp%c; 14 temp=temp*temp%c; 15 b=b>>1; 16 } 17 return res; 18 } 19 int main(){ 20 int t; 21 scanf("%d",&t); 22 while(t--){ 23 llu a,b,c; 24 scanf("%llu%llu%llu",&a,&b,&c); 25 f[0]=0,f[1]=1; 26 for (int i=2 ; ;i++){ 27 f[i]=(f[i-1]+f[i-2])%c; 28 if (f[i]==1 && f[i-1]==0) { 29 c=i-1; 30 break; 31 } 32 } 33 printf("%llu ",f[modexp(a,b,c)]); 34 } 35 return 0; 36 }