杭电1005

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package oj;

import java.util.Scanner;

public class Main_1005 {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
int a=scanner.nextInt();
int b=scanner.nextInt();
int n=scanner.nextInt();
if (a==0&&b==0&&n==0) {
break;
}else{

System.out.println(fun(a,b,n%49));
}

}

}

private static int fun(int a,int b,int n){
if (n==1) {
return 1;
}else if (n==2) {
return 1;
}else {
return (a*fun(a, b, n-1)+b*fun(a, b, n-2))%7;
}
}

}

提交去掉包名和_1005
如果不添加%49会堆栈溢出,因为n值过大,

f(n) = (A f(n - 1) + B f(n - 2)) mod 7.
从这个公式可以看出,最后每个值的范围是在[0-6]
而随着n的增长,值集合会出现周期性变化,周期最大是49,因为f(n-1)取值[0-6],f(n-2)也是,所以前面值的组合是49
就是最长周期为49。
f(n-1)和f(n-2)是连续的两个数,而两个数的取值都有7种,所以最大周期49,就比如两个连续可能是[0,0][0,1]但是无论如何
这种组合就只有49种,所以一旦f(n-1)和f(n-2)重复了它们后面的一个数也会被固定,f(n)也就被确定了