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("
");
	printf("%lld",v[k%i]);
	return 0;
}
原文地址:https://www.cnblogs.com/Nlifea/p/11746027.html