51NOD 1126求递推序列的第N项 模拟找循环节

1126 求递推序列的第N项
基准时间限制: 1 秒 空间限制: 131072 KB 分值: 10 难度: 2级算法题
收藏
关注
取消关注
有一个序列是这样定义的: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

思路:对7取模,那f[i]取值就小于7,所以循环节在7*7内就能找到(因为不一定存在从头开始的循环eg:a = b = 7,所以要限制在49内结束循环 )。

Code:

#include 
using namespace std;
const int AX = 1e6+666;
long long f[AX]; 
int main(){
	long long a,b,n;
	cin >> a >> b >> n;
	f[1] = 1 ;
	f[2] = 1 ;
	int i;
	for( i = 3 ; i <= 7 * 7 ; i++ ){
		f[i] = ((a * f[i-1] )%7  + (b * f[i-2] )%7 + 7 ) % 7;
		if( f[i] == 1 && f[i-1] == 1 ) break;
	}
	i -= 2;
	if( n % i == 0 ) cout << f[i] << endl;
	else cout << f[n%i] << endl;
	return 0;
}

你可能感兴趣的:(暑期集训刷题算法复习(新手,),数论,递推)