您的位置:首页 > 产品设计 > UI/UE

#HDOJ-1005:Number Sequence

2018-04-10 13:07 363 查看

Number Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 192652    Accepted Submission(s): 48189


[align=left]Problem Description[/align]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).
 
[align=left]Input[/align]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.
 
[align=left]Output[/align]For each test case, print the value of f(n) on a single line.
 
[align=left]Sample Input[/align]
1 1 3
1 2 10
0 0 0 
[align=left]Sample Output[/align]
2
5

这道题看起来就不是套公式递归或者迭代能做的了。数值很大,很有可能会超时或者内存不够。
看到式子里有一个mod 7 就说明f(n)的值一定是0~6之间,再代入算一遍样例里的值,发现有循环的,说明一定是在某个范围内循环的,但是这个范围就难找了。。。于是上网找了一个资料,发现很多人都能直接说是7 * 7 = 49,所以范围是0~49。但是这个7 * 7是怎么得来的呢?后面找到一个非常通俗易懂的解释

把相邻两个数组成一个group
则有
[ f(1), f(2) ]
[ f(2), f(3) ]
....
[ f(k), f(k+1) ]
因为 0 <= f(k) < 7,所以 [ f(k), f(k+1) ] 的组合是有限的(共49种可能)
必定存在最小的k,使得 [ f(k), f(k+1) ] 第二次出现(k <= 50,抽屉原理)
此时开始循环,所以循环周期一定 <= 49
作者:张雄骐
链接:https://www.zhihu.com/question/31593349/answer/52612435

因为f(n) = (A * f(n-1) + B *f(n-2))mod 7
在同一个样例中A和B是固定的了,f(n-1)和f(n-2)的值都在0~6之间,于是就有7 * 7种可能。
f(n-1)和f (n-2)这样构成一组,一共有49组。后面再出现的话,得到的结果也会在这49组里找到。

知道之后代码就非常好写了。import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A;
int B;
int n;
int []f = new int[50];
while(sc.hasNext()){
A = sc.nextInt();
B = sc.nextInt();
n = sc.nextInt();
if(A < 1 & A > 1000 & B < 1 & B > 1000 & n < 1 & n > 100000000)
return;
if(A == 0 && B == 0 && n == 0)
return;
for(int i=1;i<50;i++){
if(i == 1 || i == 2)
f[i] = 1;
else
f[i] = ( A*f[i-1] + B*f[i-2] ) %7;
}
System.out.println(f[n%49]);
}
}
} 这题和编程没太大的关系,更多的是数学上的知识.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java HDOJ