//用遞歸寫想都不要想,絕對超時,所以還應當回到題目本身的分析上來
//正確思路是:因為mod7的關系,而且f(1)=f(2)=1,所以f(n)的值是循環分布的,而且一定會回到f(n-1)=f(n)=1,
//并且還可得出,這個循環不大于49,因為相鄰連個f只有7種取值,這樣f(n-1)和f(n)共有49種組合。
//所以,只要找出循環因子即可,尋找方法正是根據f(n-1)=f(n)再次出現的地方來計算
//可以首先為這個題目寫一個測試的程序設定一個 a b n(n 比較小時) 的值 看看輸出規律
1
#include <stdio.h>
2
#include <stdlib.h>
3
int f[51];
4
int main ()
5

{
6
int a, b, n;
7
while ( scanf ("%d %d %d", &a , &b, &n) != EOF && a != 0 && b != 0 && n != 0 )
8
{
9
f[1] = f[2] = 1;
10
int i;
11
for (i = 3; i < 51; i ++)
12
{
13
f[i] = (a * f[i - 1] + b * f[i - 2]) % 7;
14
if ( f[i] == 1 && f[i - 1] == 1 ) //找到循環因子 i
15
{
16
break;
17
}
18
}
19
20
n = n % (i - 2);
21
if (n == 0) //剛好經過一個循環
22
printf ("%d\n", f[i - 2]); //開始時,我是因為看了測試程序,把這里設定為輸出 0 這種想法是錯的,太片面了,因為數據范圍很大
23
else
24
printf ("%d\n", f[n]);
25
}
26
//system ("pause");
27
return 0;
28
}
29
30
#include <stdio.h>2
#include <stdlib.h>3
int f[51];4
int main ()5


{6
int a, b, n; 7
while ( scanf ("%d %d %d", &a , &b, &n) != EOF && a != 0 && b != 0 && n != 0 )8

{9
f[1] = f[2] = 1;10
int i;11
for (i = 3; i < 51; i ++)12

{13
f[i] = (a * f[i - 1] + b * f[i - 2]) % 7;14
if ( f[i] == 1 && f[i - 1] == 1 ) //找到循環因子 i 15

{16
break;17
}18
}19
20
n = n % (i - 2);21
if (n == 0) //剛好經過一個循環 22
printf ("%d\n", f[i - 2]); //開始時,我是因為看了測試程序,把這里設定為輸出 0 這種想法是錯的,太片面了,因為數據范圍很大 23
else 24
printf ("%d\n", f[n]);25
}26
//system ("pause");27
return 0;28
} 29

30



