USACO Section 1.4.3 [Arithmetic Progressions] Java题解

[b]题意分析:[/b]
定义算术级数:一种序列a, a+b, a+2b, …,a+nb,a是非负整数,b是正整数
定义双平方:能表示成p方+q方的数,p和q为非负整数
给定N (3 <= N <= 25),要找的算术级数序列的长度;以及M (1 <= M <= 250),p和q的上限。
找出给定长度N的,所有序列元素都是双平方数的算术级数,输出a和b

[b]解题思路:[/b]
这题的时间限制是5秒。首先决定在算术级数中找双平方还是在双平方中找算术级数。直觉是在双平方数中找算术级数,首先生成所有的双平方数,保存在一个boolean数组中,这个数组大小为250×250×2=125000。然后外层循环取a(从1开始在双平方数中取),内层循环取b(从1开始取到(125000-a)/(N-1),因为满足a+(N-1)*b <=125000),得到a,b后要验证是否能构成长度为n的算术级数,若能则储存结果。最后按b,a升序的顺数输出a,b。
最大数据实际计算时间约为1.5秒

[b]代码实现:[/b]
[url]https://github.com/leonlu/USACOJavaSolution/blob/master/USACOSection1/src/ariprog.java[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值