2018年东北农业大学春季校赛 wyh的数列
链接: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
斐波那契数列对c取模会形成循环节
找循环节+快速幂即可
注意要用unsigned long long
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define read(x) scanf("%lld",&x) 4 #define out(x) printf("%lld",&x) 5 #define cfread(x) scanf("%I64d",&x) 6 #define cfout(x) printf("%I64d",&x) 7 #define mian main 8 #define min(x,y) (x<y?x:y) 9 #define max(x,y) (x<y?y:x) 10 #define f(i,p,q,t) for(i=p;i<q;i+=t) 11 #define MAXN 110000 12 #define inf 0x3f3f3f3f 13 #define mem(x,t) memset(x,t,sizeof(x)); 14 #define T true 15 #define F false 16 #define def -1*inf 17 typedef long long ll; 18 typedef long long LL; 19 typedef double dd; 20 typedef unsigned long long ULL; 21 ULL power(ULL a,ULL n,ULL m){ 22 if(n==0) 23 return 1; 24 if(n==1) 25 return a%m; 26 ULL p = power(a,n>>1,m); 27 p = ((p%m)*(p%m))%m; 28 if(n&1) 29 p = ((p%m) * (a%m))%m; 30 return p; 31 } 32 ULL f[2000000]; 33 void deal(){ 34 ULL a,b,c; 35 scanf("%llu%llu%llu",&a,&b,&c); 36 f[0] = 0; 37 f[1] = 1; 38 int i=2; 39 while(true){ 40 f[i] = f[i-1] + f[i-2]; 41 f[i]=f[i]%c; 42 if(f[i]==f[1]&&f[i-1]==f[0]) 43 break; 44 i+=1; 45 } 46 i-=1; 47 ULL ans = f[power(a,b,i)]; 48 printf("%llu\n",ans); 49 } 50 int main(){ 51 int t; 52 cin>>t; 53 while(t--) 54 deal(); 55 return 0; 56 }