NYOJ 427 & HDU 1005 Number Sequence(找循环节)
2015-04-18 21:49
507 查看
【题目链接】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,则后面的全部和前面相同,可以断定出现了周期
跳出循环
代码:
【题目大意】已经
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,则后面的全部和前面相同,可以断定出现了周期
跳出循环
代码:
#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(找循环节)
- hdu1005&&nyoj-427 一个关于循环节的问题
- HDU 1005 Number Sequence (寻找循环节)
- HDU 1005 Number Sequence
- hdu 1005 Number Sequence(循环节)
- hdu 1005 Number Sequence(智寻循环节)
- 51nod 1126 求递推序列的第N项 && hdu - 1005 Number Sequence (求周期)
- HDU 1005 Number Sequence(循环节) *
- HDU 1005 Number Sequence【循环节】
- HDU 1005 Number Sequence 打表找循环节
- HDU 1005 Number Sequence (找循环节)
- HDU 1005 Number Sequence(矩阵快速幂、循环节)
- HDU 1005 Number Sequence (循环节)
- HDU 1005 Number Sequence (循环节)
- HDU 1005 Number Sequence【循环节(取模)】
- HDU 1005 Number Sequence (循环节)
- hdu-1005-Number Sequence
- hdu 1005 Number Sequence
- NYOJ--364&&HDU--1052
- hdu 1005 number sequence