题目描述
一个数字序列定义如下:f(1)= 1,f(2)= 1,f(n)=(A * f(n-1)+ B * f(n-2))mod 7.给定A,B和n,您将要计算f(n)的值。
输入
输入包含多个测试用例。每个测试用例在一行上包含3个整数A,B和n(1 <= A,B <= 1000、1 <= n <= 100,000,000)。三个零表示输入结束,该测试用例将不被处理。
输出
对于每个测试用例,输出一行,为f(n)的值。
样例输入
1 1 3
1 2 10
0 0 0
样例输出
2
5
题解
这个题数据量太大,直接求肯定会超时,我们用excel测试一下数据,发现他们具有一定的规律,就是,每一组总是以1,1开始这一次循环
所以我们就可以,先找出他每次的循环个数,再对他取余
而且,我们的数据从1开始,那应该把 f [ 0 ]设置为循环的最后一个数字
下面是AC代码
#include <iostream>
using namespace std;
int f[200];
int main()
{
int a,b,n,i;
while(cin>>a>>b>>n&&a!=0&&b!=0&&n!=0)
{
f[1]=f[2]=1;
for(i=3; i<200; i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
if(f[i]==1 && f[i-1]==1)
break;
}
f[0]=f[i-2];
cout<<f[n%(i-2)]<<endl;
}
return 0;
}