校赛时的3题,我没怎么看,觉得规律题是可遇不可求的。今天看下,学习下规律题的做法。
还有之前的斐波那契数列。
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
遵循的规律如上。可知0<=F[n]<=6.所以(F[n-1],F[n-2])的范围在49以内。F[50];
第二步,找到循环点。比赛时之所以觉得难是因为变化的不仅仅是n,还有A和B如果A,B都考虑的话那得1000*1000种情况,有点多。但是其实只需做1,2组就可以看出规律:
(1,1) 便是F[]的循环节。
For(i=2;i<50;i++)
{
F[i]=(A*F[i-1]+B*F[i-2])%7;
If(F[i]==1&&F[i-1]==1)break;
}
找到循环节之后再将n对i-1取余,可求出F[n-1].
再进一步,既然F是个50个长度的数组,F[48]=F[49]=1;
#include<stdio.h> int main() { long n,A,B,i,F[49]; F[0]=1; while(scanf("%ld%ld%ld",&A,&B,&n)) { if(A==0&&B==0&&n==0) break; F[1]=1;F[2]=1; for(i=3;i<49;i++) F[i]=(A*F[i-1]+B*F[i-2])%7; printf("%ld\n",F[n%48]); } }