第一次看到这个题目,还以为很简单的。随随便便写下代码,(心底是觉得有些怪的,因为这需要大量递归,浪费不少时间),确实,没有AC 呀 , 而是 Time Limit Exceeded 呢 。
思考半天也没想起怎么解决这个递归问题,查看了一下帖子,才发现原来这个序列数据是有规律的,
从以下的大量实例中可以得到规律:每48组为一个循环。
a[1]=1 a[2]=1 a[3]=3 a[4]=5 a[5]=4 a[6]=0 a[7]=1 a[8]=1 a[9]=3
a[10]=5
a[11]=4 a[12]=0 a[13]=1 a[14]=1 a[15]=3 a[16]=5 a[17]=4 a[18]=0a[19]=1
a[20]=1 a[21]=3 a[22]=5 a[23]=4 a[24]=0 a[25]=1 a[26]=1 a[27]=3 a[28]=
5 a[29]=4 a[30]=0 a[31]=1 a[32]=1 a[33]=3 a[34]=5 a[35]=4 a[36]=0 a[37]
=1 a[38]=1 a[39]=3 a[40]=5 a[41]=4 a[42]=0 a[43]=1 a[44]=1 a[45]=3 a[46
]=5 a[47]=4 a[48]=0 a[49]=1 a[50]=1 a[51]=3 a[52]=5 a[53]=4 a[54]=0 a[5
5]=1 a[56]=1 a[57]=3 a[58]=5 a[59]=4 a[60]=0 a[61]=1 a[62]=1 a[63]=3 a[64]=5 a[65]=4 a[66]=0 a[67]=1 a[68]=1 a[69]=3 a[70]=5 a[71]=4
a[72]=0 a
[73]=1 a[74]=1 a[75]=3 a[76]=5 a[77]=4 a[78]=0 a[79]=1 a[80]=1 a[81]=3a[82]=5 a[83]=4 a[84]=0 a[85]=1 a[86]=1 a[87]=3 a[88]=5 a[89]=4a[90]=0 a[91]=1 a[92]=1 a[93]=3 a[94]=5 a[95]=4 a[96]=0
不仿把,n=48、96...记为n=0的情况;
AC代码如下:
#includeusing namespace std;int f(int n , int A ,int B){ if(n==0) return 0; else if(n == 1) return 1; else if(n == 2) return 1; else return (A * f(n-1 ,A , B ) + B * f(n-2 , A , B )) % 7 ;}int main(){ int A , B , n; while((cin>>A>>B>>n) && A!=0 && B!=0 && n!=0) { cout< <