1. 程式人生 > >51nod-【1126 求遞推序列的第N項】

51nod-【1126 求遞推序列的第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)的值。
Input示例
3 -1 5
Output示例

6

這個道題目讓我對取餘(模)有了全新的認識,我們需要討論的有2個問題

1、迴圈節最多有多少個,其實很簡單就是7*7, 49個

想一想對於每一個數位對7取模後一共有7個可能,那麼每迴圈7次

這個數位上的值也只有7種變化可能,那有一次的變化和前面的其中一次

相同時,那肯定就是一個迴圈了;

2、關於取模問題;a%b的值正數取餘於正數是相同的,但是餘數的符號於

被除數的符號相同 ;這是c++裡面的取模,但是在這一題mod是求出

非負的值,我們需要在原來結果上加上一個mod,就是我們需要結果

3、需要注意的小問題,在下面的程式碼中for迴圈一定要加49這個

限制條件,因為如果只依靠 f[i]==1&&f[i-1]==1這個條件有可能

跳不出迴圈 比如 a=7,b=7

#include<cstdio>
typedef long long LL;
LL f[50]; 
int main()
{
	f[1]=f[2]=1;
	LL a,b,n;
	scanf("%lld%lld%lld",&a,&b,&n);
	LL i,len=2; 
	for(i=3;i<=49;++i) 
	{
		f[i]=((a*f[i-1]+b*f[i-2])%7+7)%7;
		if(f[i]==1&&f[i-1]==1)
			break; 
	}
	i-=2;
	f[0]=f[i];
	printf("%lld\n",f[n%i]);  
	return 0;
}