HDU-OJ 1005 - Number Sequence(java版)记录贴

菜鸡又来刷杭电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]值。

学习之路还很长,加油!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值