http://acm.hdu.edu.cn/showproblem.php?pid=1005
题意比较好理解。要解决的问题是数据规模比较大。
因为是二阶递推而且数据都模7,所以从概率的角度来看,发现f[n]从某项开始一定会循环(且周期小于等于49)。
Discuss里有人提出来周期一定是49(不一定是最小周期),并且AC了,我觉得不能理解(数论太渣么= =、),于是让代码自己去找这个循环了。。
代码如下:
#include<cstdio>
int main()
{
long f[10000],a,b,n,i,j,flag=0,k;
while(1)
{
scanf("%ld%ld%ld",&a,&b,&n);
if(a==0&&b==0&&n==0) break;
f[1]=f[2]=1;a%=7;b%=7;
for(i=3;;i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
for(j=2,flag=0;j<i;j++)
if(f[i]==f[j]&&f[i-1]==f[j-1]) {k=i-j;flag=1;break;}
if(flag) break;
}
if(n>j) n=(n-j)%k+j;
printf("%ld\n",f[n]);
}
return 0;
}