【题目链接】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种可能,直接模拟递推式试试,结果发现不行,后来想到了用循环节,不难想到:
代码:
#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;
}
NYOJ 427 & HDU 1005 Number Sequence(找循环节)
原文地址:http://blog.csdn.net/u013050857/article/details/45116827