菜鸡又来刷杭电OJ的题了,先给出原题:
Number Sequence
Problem Description
A number sequence is defined as follows:
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
Input
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.
Output
For each test case, print the value of f(n) on a single line.
Sample Input
1 1 3
1 2 10
0 0 0
Sample Output
2
5
这道题乍一看很简单,但是其中输入的n值取值范围却很大,如果用一般的想法去做的话很容易出现Time Limit Exceeded,前几次提交的时候没有想得那么深,先贴出我原先写的方法:
int numberSequence(int A , int B , int n){
if(n == 1 || n == 2) {
return 1;
}
int i = 1; //f(n-2)中的n-2
int j = 1; //f(n-1)中的n-1
int sequence = 0;
for(int k = 3;k < 50;k++) {
sequence = Math.floorMod(A * j + B * i, 7);
i = j;
j = sequence;
}
return sequence;
}
}
结果等待我的就是大大的Time Limit Exceeded,开始还没想到是因为n取值太大循环次数太多导致运行时间太长,冥思苦想还是想不出,于是就在网上查了一下,才发现原来大佬们做得这么精妙,贴上根据大佬们的思想改良后的代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int A = in.nextInt();
int B = in.nextInt();
int n = in.nextInt();
while(A != 0 || B != 0 || n != 0) {
System.out.println(numberSequence(A , B , n));
A = in.nextInt();
B = in.nextInt();
n = in.nextInt();
}
in.close();
}
static int numberSequence(int A , int B , int n){
if(n == 1 || n == 2) {
return 1;
}
int f[] = new int[50];
f[1] = 1;
f[2] = 1;
for(int i = 3;i < 50;i++) {
f[i] = Math.floorMod(A * f[i-1] + B * f[i-2], 7);
}
return f[n % 49];
}
}
因为在这里对7取模只有{0,1,2,3,4,5,6}这七种情况,所以f[n-1]f[n-2]有7*7 = 49种组合,将这49种组合情况算出后存在数组中,对n值对49取余数,得到的值对应的数组中的数值就是我们所要求得的f[n]值。
学习之路还很长,加油!