题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005
题目大意:一个数列f(1) = 1, f(2) = 1, f(n) = (A * f(n – 1) + B * f(n – 2)) mod 7
给出A、B,求f(n)。
关键思想:考虑到f(n)只可能为0,1,2,3,4,5,6中的一个。所以必然会产生循环最大循环节为49。
代码如下:
//鸽巢原理。对重复的规律保持敏感。找循环节。 #include <iostream> using namespace std; int main(){ int f[54]={0,1,1};//用到1-49 int a,b,n; while(cin>>a>>b>>n){ int s=1;//循环节长度 if(a+b+n==0)break; for(int i=3;i<54;i++){ f[i]=(a*f[i-1]+b*f[i-2])%7; if(i>5){ if(f[i]==f[4]&&f[i-1]==f[3]){ s=i-4; break; } } } if(n>2)cout<<f[(n-3)%s+3]<<endl; else cout<<1<<endl; } return 0; }