题目描述
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).
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).
输入
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.
输出
For each test case, print the value of f(n) on a single line
.
示例输入
1 1 3 1 2 10 0 0 0
示例输出
2 5
来源
ZJCPC2004
思路:
1,题解:
该题看似复杂,实则不然;关键的解题的点就在题干处的“mod7”,并且在题干处表明n的取值在1~100000000之间,又因为时间在1000m之内,因此在题目中必定有循环,而找到循环点就是解题的关键。
2,找循环节长度:
在找节点时并非非要找到循环点,而是要在最快的时间里找到最容易找到的循环节点;因为是“mod7”,故循环的节点一定与“7”有关,而因为题目中是由“A”,“B”来求得f(n)的值,故可知一个完整循环节的长度为49。
3,确定f(0)的可能值:
在找到循环结长度后,因为题干中只给了f(1),f(2)的值,故在循环中,是无法计算上f(0)的取值的,因此在最后输出时,应当是输出f(n%(49-1【将初始循环时的f(0)除去】)+1(在除去后n变为n-1故要加一))。
代码
<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
int main()
{
int a,b,n,i;
int f[49];
while(1)
{
scanf("%d%d%d",&a,&b,&n);
if(a==0&&b==0&&n==0)
break;
f[1]=1;
f[2]=1;
for(i=3; i<=48; i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
}
printf("%d\n",f[(n-1)%48+1]);
}
return 0;
}