hdu 1005 || zoj 2105 Number Sequence(规律)

时间:2022-06-04 20:01:56

Hdu 1005

校赛时的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]);  
     }                     
}