NYOJ 427 & HDU 1005 Number Sequence(找循环节)

题目链接】click here~~

题目大意】已经 f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.求f(n),

【解题思路】:此题是大三届的一场比赛题,前几天做了下,结果是不忍直视啊,wa了几乎一页了,最开始想的是用矩阵快速幂,但是想了想,取模数才不到10,7

7=49,也就是说最大结果不超过49种可能,直接模拟递推式试试,结果发现不行,后来想到了用循环节,不难想到:

  1.  如果结果有两个答案连着 =1,则后面的全部和前面相同,可以断定出现了周期  
  2.  跳出循环 

代码:

#include <bits/stdc++.h>
using namespace std;
int F[100001];
int main()
{
    int i,A,B,N;
    F[1]=F[2]=1;
    while(~scanf("%d%d%d",&A,&B,&N))
    {
        if(A==0&&B==0&&N==0) break;
        if(N==1||N==2)  puts("1");
        else
        {
            for(i=3; i<100000; i++)
            {
                F[i]=(A*F[i-1]+B*F[i-2])%7;
                if(F[i]==1&&F[i-1]==1) break;  //如果有两个连着 =1,则后面的全部和前面相同,即出现了周期  
                                               
            }
            i=i-2;                            // 跳出循环, i-2为周期   
            F[0]=F[i];
            printf("%d\n",F[N%i]);
        }
    }
    return 0;
}
 



你可能感兴趣的:(数学,ACM)