1. 程式人生 > >UVA 11582 Colossal Fibonacci Numbers!(循環節打表+冪取模)

UVA 11582 Colossal Fibonacci Numbers!(循環節打表+冪取模)

數列 targe CA == ons printf sin for pan

題目鏈接:https://cn.vjudge.net/problem/UVA-11582

 1 /*
 2 問題
 3 輸入a,b,n(0<a,b<2^64(a and bwill not both be zero) and 1<n<1000)
 4 計算並輸出f(a^b)%n的結果
 5 其中f(i)是斐波那契數列
 6  
 7 解題思路
 8 所有的結果都是f(i)對n取模,不妨設F(i)=f(i)%n。不難發現當F(i),F(i+1)出現重復的時候,整個序列就開始出現重復。
 9 
10 所以設周期為mod,計算出一個循環周期F(0)~f(n^2-1),計算出F(a^b % mod)即可。 
11 */ 12 #include<cstdio> 13 #include<iostream> 14 #include<string> 15 using namespace std; 16 17 const int N=1000110; 18 int F[N],mod; 19 int makeF(int n); 20 int kpow(unsigned long long a,unsigned long long p); 21 22 int main() 23 { 24 unsigned long long a,b; 25 int n,T; 26 scanf("
%d",&T); 27 while(T--){ 28 cin>>a>>b>>n; 29 if(n==1||!a) {printf("0\n");continue;} 30 mod=makeF(n); 31 printf("%d\n",F[kpow(a%mod,b)]); 32 } 33 return 0; 34 } 35 36 int kpow(unsigned long long a,unsigned long long p){ 37 int ans=1
; 38 for(;p;p>>=1,a=(a*a)%mod) if(p&1) ans=(ans*a)%mod; 39 return ans; 40 } 41 42 int makeF(int n) 43 { 44 F[0]=0; 45 F[1]=1; 46 F[2]=1; 47 int l=n*n+10; 48 for(int i=3;i<=l;i++){ 49 F[i] = ((F[i-1]%n)+(F[i-2]%n))%n; 50 if(F[i]==F[2] && F[i-1]==F[1]){ 51 return i-2; 52 } 53 } 54 }

UVA 11582 Colossal Fibonacci Numbers!(循環節打表+冪取模)