hdu 1005 用mod的循环性质
2010-05-22 13:19
405 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1005
A number sequence is defined as follows:
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
1 <= A, B <= 1000, 1 <= n <= 100,000,000
解:
f(n) = (A * f(n - 1) + B * f(n - 2)) %7
= (A * f(n - 1) %7 + B * f(n - 2) %7) %7
所以对于给定的A和B,可以先打表,找出数列的循环部分. 鸽巢原理知,状态总数不会超过7*7
注意循环节不一定从f(3)开始...
A number sequence is defined as follows:
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
1 <= A, B <= 1000, 1 <= n <= 100,000,000
解:
f(n) = (A * f(n - 1) + B * f(n - 2)) %7
= (A * f(n - 1) %7 + B * f(n - 2) %7) %7
所以对于给定的A和B,可以先打表,找出数列的循环部分. 鸽巢原理知,状态总数不会超过7*7
注意循环节不一定从f(3)开始...
#include <iostream> using namespace std; int a,b,n,x,y,l,h,m[7][7],q[300]; int main() { while(scanf("%d%d%d",&a,&b,&n)!=EOF && (a||b||n)) { memset(m, 0, sizeof(m)); q[1] = q[2] = 1; x = y = 1; l=3; while(m[x][y]==0) { //该状态还未经历过,则扩展 q[l] = (a*x+b*y)%7; m[x][y] = l; y = x; x = q[l++]; } //此时,q[1...h-1]为前面的非循环部分 //q[h...l-1]为循环节 h = m[x][y]; //循环节的起始位置 if(n<h) { printf("%d/n",q ); } else { printf("%d/n",q[((n-h)%(l-h))+h]); } } return 0; }
相关文章推荐
- HDU - 1005 Number Sequence 公式递推(循环) JAVA练习
- 【循环小数性质】HDU 1717——小数化分数2
- HDU-1005 Number Sequence 循环结
- hdu 1005 数论 循环
- HDU 1005 Number Sequence 找循环区间的长度
- hdu 1005 找规律(循环点)
- HDU 1005题解,这种题目关键在于寻找循环节,这很重要1,很容易找到循环环节是49,AC就是理所当然
- HDU 5728 PowMod(数论,欧拉函数的各种性质)
- HDU 1005 Number Sequence 找循环位置
- HDU 1005 Number Sequence(循环周期是关键)
- hdu 1005 超规模>>找规律>>有限次数循环
- HDU 1000,1001,1002,2000,2001,1003,1004,1005,1006
- 贪心——HDU 5813 ( 2016 Multi-University Training Contest 7 1005 )
- hdu 1005
- hdu 3038 How Many Answers Are Wrong(带权并查集+树的性质)
- HDU 5414 矩阵的性质
- hdu 1005 (规律 循环节)
- HDU 4081 Qin Shi Huang's National Road System 最小/次小生成树的性质
- HDOJ 1005:取余,循环,找规律
- hdu-1005 Number Sequence