求递推序列的第N项
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
给出A,B和N,求f(n)的值。
Input输入3个数:A,B,N。数字之间用空格分割。(-10000 <= A, B <= 10000, 1 <= N <= 10^9)Output输出f(n)的值。Sample Input
3 -1 5
Sample Output
6
#include<stdio.h>
#include<cstdlib>
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
int main()
{
LL f[50]; f[1] = 1; f[2] = 1;
LL a, b, n;
cin >> a >> b >> n;
int i;
//查找循环节
for (i = 3; i <= 49; i++)// 当有两个数重复时候,接下来的数一定进入循环,这两个数一共有7*7种情况,每个循环节长度不超过49
{
f[i] = ((a*f[i - 1] + b * f[i - 2]) % 7 + 7) % 7;// 取模结果都是正数!!!
//cout<<f[i]<<'\n';
if (f[i] == 1 && f[i - 1] == 1)
break;
}
//cout<<i;
f[0] = f[i - 2];// !!!!!
cout << f[n % (i - 2)]<<'\n';
return 0;
}
程序有bug但是依旧ac?????
当a=0,b=0,n=50的时候,输出1,实际上是0。因为这时候查找循环节的时候会将周期定为49(maybe),而实际上这个数列是1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0... ...