有一个序列是这样定义的: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)的值。
Input示例
3 -1 5
Output示例
6注意: 1、循环节最大长度为7*7 = 49 2、循环节中不一定包含1,1 3、C++中mod可能为负值,所以要做一下处理
#include<stdio.h>
int f[52];
int main()
{
f[1]=f[2]=1;
int a,b,n;
scanf("%d%d%d",&a,&b,&n);
a = a%7;
b = b%7;
for(int i=3;i<=51;i++)
{
f[i]=((a*f[i-1]+b*f[i-2])%7+7)%7;
}
int flag,flag1,flag2;
flag = 0;
for(int i = 1; i <= 49; i++)
{
for(int j = i+1; j <= 50; j++)
{
if(f[j] == f[i] && f[j+1] == f[i+1])
{
flag = 1;
flag1 = i; //循环节的起始位置
flag2 = j; //flag2-flag1就是循环节的长度
}
}
if(flag)
break;
}
if(n < flag1)
printf("%d",f[n]);
else
printf("%d\n",f[flag1+(n-flag1)%(flag2-flag1)]);
return 0;
}