1126 求递推序列的第N项 (Fnb + mod + 思维)
有一个序列是这样定义的: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 去余那么循环节的长度最长为49(7*7)(关于这里可以自己好好想一下,提升一下自己的思维)
2,其次,mod运算是求一个正数的值,而c++里面则会算出负值,因此取mod之后加上mod再取mod
AC:代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll v[50];
int main()
{
ll n,m,k,i;
cin>>n>>m>>k;
v[1] = 1;v[2] = 1;
for( i = 3;i<=49;i++)
{
v[i] = ((n*v[i-1] + m*v[i-2])%7 + 7)%7;
if(v[i] == 1 && v[i-1] ==1) break;
}
i -= 2;v[0] = v[i];
// for(int j = 0;j<=i;j++){
// printf("%d ",v[j]);
// }printf("\n");
printf("%lld",v[k%i]);
return 0;
}