【题目链接】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