Number Sequence
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 1 31 2 100 0 0
25
#include <iostream>
using namespace std;
//不能用递归来做,n是小于 100000000,用递归的话,递归栈会溢出的,
//所以用数组来做,此题主要来找规律,因为 f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
//所以f(n)的结果只能是0,1,2...6等七种情况,所以至多到7*7=49时出现循环
//所以我们要找循环的长度
int main()
{
int n,A,B,i;
int a[50]={0};
a[2]=a[1]=1;//根据题目条件,初始化为1
while(cin>>A>>B>>n && 0<=A<=1000 && 0<=B<=1000&& 0<=n<=100000000)
{
if(n==0&&A==0&&B==0)//输入0,0,0表示退出
break;
for(i=3;i<=49;i++)//从3开始,因为数组1,2是临界条件为1;到49,因为循环长度最多为49
{
a[i]=(A*a[i-1]+B*a[i-2])%7;//题目要求
if(a[i]==a[2]&&a[i-1]==a[1])//表示找到循环点了,开始从a[1],a[2]的值循环了,跳出for,找到i
break;
}
i-=2;//退回2,表示i为整个循环的长度
if(n%i==0)//表示n能整除循环长度,就输出a[n]
n=i;
else//表示不能整除,则n为整除i后的余值,即1到循环长度i中间的一个值
n%=i;
cout<<a[n]<<endl;//输出
}
return 0;
}
注意可以这样:
for(i=3;i<=48;i++)
a[i%48]=(A*a[i-1]+B*a[i-2])%7;
cout<<number[n%48]<<endl;