题意:给了一个递推公式,范围是 1<=n<=100000000,求f[n]
解法:一开始直接递归的,超时,因为n太大。然后只能找找规律吧。因为公式里有%7,显然会产生一个数据周期,那么当连续出现两个1时,就代表进行了一个周期,这是break出循环,减小了时间。
AC代码:
#include <iostream>
using namespace std;
int main()
{
int ans[1000];
ans[1]=1;
ans[2]=1;
int a,b,n;
while(cin>>a>>b>>n)
{
if(a==0&&b==0&&n==0)
{
break;
}
int i=3;
for(;i<1000;i++)
{
ans[i]=(a*ans[i-1]+b*ans[i-2])%7;
if(ans[i]==1&&ans[i-1]==1) //因为连续出现两个1,那么之后的数据就和之前的一样了,这是一个循环
break;
}
n=n%(i-2);//(i-2)是周期大小。但是有特殊情况n==0
if(n==0) n=i-2; //当n==0 也就是初始n==i-2 那么就输出f[i-2]就可以
cout<<ans[n]<<endl;
}
return 0;
}