這道題目n的取值範圍很大,1 <= n <= 100,000,000。因此肯定是需要優化才能AC。
首先我考慮到時是有沒有通項公式,研究了一下,沒發現什麼東西,突然看到兩個1時就想到會不會在數組中有循環,然後當下次連續出現兩個1時即爲一次循環。這時我們就只需計算一個循環週期就可以了。另外,讓我更堅定有循環的是公式有個取模運算,因而肯定有一個循環。知道這個思路後代碼就簡單了。
不過讓我感到詭異是在尋找數組規律裏的那個循環中,循環的限制條件中我沒寫,結果直接WA了,然後一直不解,於是加了個i<51試了下AC了。
考慮到f[i]的取值只能在0~6之間。因而,f[i],f[i-1]只有7*7=49種可能的組合,剛開始我並不能確定下一個循環一定會出現1,1.但是後來想了一下,如果有循環的話,1,1肯定會繼續出現的,如果不出現就不能算是有循環。因而如有循環1,1肯定會再次出現。
#include <stdio.h>
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
long n;
int a,b,i;
int f[51];
while(scanf("%d %d %ld",&a,&b,&n)==3)
{
if(0 ==a && 0 == b && 0 ==n)
break;
f[1] = 1;
f[2] = 1;
for(i=3;i<51;i++)
{
f[i] = (a*f[i-1]+b*f[i-2])%7;
if(f[i]==1 && f[i-1]==1)
{
break;
}
}
int ans = n%(i-2);
if(ans == 0)
{
printf("%d\n",f[i-2]);
}
else
{
printf("%d\n",f[ans]);
}
}
return 0;
}