標籤:hdu 1005 number sequence f1 1 f2 1 fn a fn - 1 + b f
首先暴力打表就很容易發現有迴圈節,於是一開始的寫法是直接暴力找迴圈節,結果一直WA,
原因是有的迴圈並不是從1,1開始的,詳細有證明戳這裡:http://acm.hdu.edu.cn/discuss/problem/post/reply.php?postid=19818&messageid=1&deep=0
於是借鑒了大神的思路,因為%7,故可用v[7][7]來記錄 f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.這個狀態。若出現相同的狀態,則證明出現了迴圈節。
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1005
代碼如下:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cctype>#include<algorithm>#include<string>#define N 100using namespace std;int v[7][7]; int f[N]={0,1,1};int main(){ int A,B,n; while(scanf("%d%d%d",&A,&B,&n),A+B+n) { int x=1,y=1,k=3; memset(v,0,sizeof(v)); while(!v[x][y]) { v[x][y]=k;//記錄這種狀態出現的位置。 f[k]=(A*y+B*x)%7; x=y; y=f[k]; k++; } int s=v[x][y]; //因為迴圈可能不是從1,1開始,所以這裡很重要。 if(n<k) printf("%d\n",f[n]); else printf("%d\n",f[(n-s)%(k-s)+s]);//k-s即周期T。 } return 0;}
HDU 1005 Number Sequence (迴圈節)