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).
Input
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.
Output
For each test case, print the value of f(n) on a single line.
Sample Input
1 1 3
1 2 10
0 0 0
Sample Output
2
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).
Input
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.
Output
For each test case, print the value of f(n) on a single line.
Sample Input
1 1 3
1 2 10
0 0 0
Sample Output
2
5
这个题不能暴力循环,一是时间超出限制,二是明显有个%7——就在提醒我们有个内部循环节(否则为什么不mod1000000007)
关键在于找循环长度
由递推公式可以知道如果连续两个数值和前面连续两个数重复那么就找到了循环节了(两个数就可以确定第三个数了)
而且循环节的起始点不一定是第一个数,所以输入的n应该减去非循环部分,所以j的生存域得大一点
#include<iostream>
#include<algorithm>
#include<memory.h>
using namespace std;
int findreg[1010];
int main()
{
int a,b;
int n;
// int num1 ;
// int num2 ;
// int num3;
while(cin>>a>>b>>n)
{
if(a == 0 && b == 0 && n == 0)break;
int j;
int retur = 0;
memset(findreg,0,sizeof(findreg));
findreg[1] = 1;
findreg[2] = 1;
if(n == 1 || n == 2)
{
cout<<"1"<<endl;
continue;
}
else
{
for(int i = 3;i <= 10005;i++)
{
findreg[i] = (a * findreg[i - 1] + b * findreg[i - 2]) % 7;
for(j = 2;j < i;j++)
{
if(findreg[i] == findreg[j] && findreg[i - 1] == findreg[j - 1])
{
retur = i - j;
break;
}//遍历去找循环节
}
if(retur)
{
break;
}
}
if(n < j)
{
cout<<findreg[n]<<endl;
}
else
{
cout<<findreg[(n - j) % retur + j]<<endl;//开头不是循环节的地方要减去
}
}
}
return 0;
}