51nod-【1126 求遞推序列的第N項】
阿新 • • 發佈:2019-01-31
有一個序列是這樣定義的: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 5Output示例
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;
}