您的位置:首页 > 产品设计 > UI/UE

杭电ACM 1005 Number Sequence

2012-08-07 15:16 246 查看

Number Sequence

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 38553 Accepted Submission(s): 8150


[align=left]Problem Description[/align]
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).

[align=left]Input[/align]
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.

[align=left]Output[/align]
For each test case, print the value of f(n) on a single line.

[align=left]Sample Input[/align]



1 1 3
1 2 10
0 0 0


[align=left]Sample Output[/align]



2
5

苦B了好长时间,终于解决啦。。

思路:
因为循环的条件就是有2个数m和n
f[m-1] = f[n-1], f[m] = f

这样就会开始循环了。
即f[n-1], f
与之前的[m-1],f[m]分别对应
而 0 <= f[n-1],f
< 7
所以f[n-1]f
连着的情况有7*7的情况。
只需每次求出一个f
,然后比较f[n-1]f
与前面数的情况即可。
程序如下:
#include<stdio.h>
int main()
{
long int a,b,n,T,s[101];
while(scanf("%ld%ld%ld",&a,&b,&n)&&(a!=0&&b!=0&&n!=0))
{
int i,j,T;
s[0]=1;
s[1]=1;
for(i=2;i<101;i++){//第一个循环
s[i]=(a*s[i-1]+b*s[i-2])%7;
for(j=1;j<i-1;j++)//第二个循环
{
if(s[j-1]==s[i-1]&&s[j]==s[i]){
T=i-j;
break;
}
}
}
n = n%T;
printf("%ld\n",s[n-1]);
}
return 0;
}

注意以下几点:
1.用长整型定义n。
2.找出循环的周期T。我这里的话,通过两个来找T,条件是:s[j-1]==s[i-1],s[j]==s[i].
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: