转自:http://blog.csdn.net/middle544291353/article/details/7723427
这题看起来很容易,不过格式很多限制,比如内存,运行时间等的限制。所以递归是行不通的。
经过思考,看看组合数学,竟然还是没头脑,虽然知道周期为7*7=49.但是还是AC不了,结果无疑看到这个:
1。由题目的式子可知0<=f[n]<=6,
2。而每个f[n]又是由(f[n-1],f[n-2])这个组合通过计算得出来的,
由以上两点可以推出,(f[n-1],f[n-2])出现重复的组合的最大周期为7*7=49, 即f[n]的最大周期
所有, 我们只要算出一个周期中所有的f[n]的值并记录下周期i即可.
代码是经过一点经过修改的,还是要感谢那个写贴的博客主。
#include <iostream>
using namespace std;
int main()
{
int a,b,n,i,f[53];
while(cin>>a>>b>>n)
{
if(a==0 && b==0 && n==0) break;
if(n==1 || n==1)
{
cout<<"1"<<endl;
continue;
}
f[1]=1,f[2]=1;
a%=7,b%=7;
for(i=3;i<=52;i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
if(f[i-1]==1 && f[i]==1) break;
}
i=i-2;
n%=i;
f[0]=f[i];
cout<<f[n]<<endl;
}
return 0;
}