計蒜客 - T1497 - 又是斐波那契數列
阿新 • • 發佈:2020-12-30
計蒜客 - T1497 - 又是斐波那契數列
題目
有另一種斐波那契數列:
F0=7,F1=11,Fn=Fn−1+Fn−2(n>=2)。
輸入格式
輸入資料有多行組成,每一行上是一個整數 n(n≤106)。
輸出格式
如果 Fn 能被 3整除,那麼列印一行"yes",否則,列印一行"no"。
提示
先使用陣列把 1∼10的六次方的Fi計算出來,然後每次查詢,要不然會超時的。
Sample Input
0
1
2
3
4
5
Sample Output
no
no
yes
no
no
no
題意
照公式模擬答案,根據提示把答案存下來,再查詢,否則超時只能過3個點
思路
水題 關鍵點:判斷能否被3整除,具體的值不重要,只要知道能不能被整數就可以了,利用下標查詢
坑點
數值範圍大,要用long long儲存 當long long儲存不下時,我們採用取模操作,邊存邊去模,不影響結果。此題是例外,可以取巧,正常情況下需使用矩陣快速冪。
程式碼
/*//10個點過3個點 超時 #include<bits/stdc++.h> using namespace std; const int mod=100000007; int main() { long long int n; while(scanf("%lld",&n)!=EOF) { long long int ans=2,num1=7,num2=11; if(n==0) { printf("no\n"); } else if(n==1){ printf("no\n"); } else{ for(int i=2;i<=n;i++) { ans=num1+num2; num1=num2%mod; num2=ans%mod; } //printf("%lld",ans); if(int(ans)%3==0) { printf("yes\n"); }else{ printf("no\n"); } } } return 0; } */ #include<bits/stdc++.h> using namespace std; const long long int mod=3; long long int ans[1000005]; int main() { long long int n; ans[0]=7; ans[1]=11; for(int i=2;i<1000003;i++) { ans[i]=(ans[i-1]%mod+ans[i-2]%mod)%mod; //printf("%lld\n",ans[i]); } while(scanf("%lld",&n)!=EOF) { //printf("%lld",ans[n]); if(ans[n]%mod%3==0) { printf("yes\n"); }else{ printf("no\n"); } } return 0; }
思考
如何使用矩陣快速冪求解