您的位置:首页 > 其它

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)开始...
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: