usaco1.4.1 Arithmetic Progressions

一. 原题

Arithmetic Progressions

An arithmetic progression is a sequence of the form a, a+b, a+2b, ..., a+nb where n=0,1,2,3,... . For this problem, a is a non-negative integer and b is a positive integer.

Write a program that finds all arithmetic progressions of length n in the set S of bisquares. The set of bisquares is defined as the set of all integers of the form p2 + q2 (where p and q are non-negative integers).

TIME LIMIT: 5 secs

PROGRAM NAME: ariprog

INPUT FORMAT

Line 1:N (3 <= N <= 25), the length of progressions for which to search
Line 2:M (1 <= M <= 250), an upper bound to limit the search to the bisquares with 0 <= p,q <= M.

SAMPLE INPUT (file ariprog.in)

5
7

OUTPUT FORMAT

If no sequence is found, a single line reading `NONE'. Otherwise, output one or more lines, each with two integers: the first element in a found sequence and the difference between consecutive elements in the same sequence. The lines should be ordered with smallest-difference sequences first and smallest starting number within those sequences first.

There will be no more than 10,000 sequences.

SAMPLE OUTPUT (file ariprog.out)

1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24

二. 分析

求所有长度为n(n<=25)的等差数列,数列中的元素满足:首项为非负整数,公差为正整数。每个数都要能表示成p^2+q^2的形式(0<=p,q<=m, m<=250)。
直接枚举可能的首项和公差就行了。前几次交的时候我判断一个数是不是平方和的方法太慢了,后来把250以内的平方数两两相加,用一个bool数组O(1)判断就可以过了。

三. 代码

运行结果,附数据
USER: Qi Shen [maxkibb3]
TASK: ariprog
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 4304 KB]
   Test 2: TEST OK [0.000 secs, 4304 KB]
   Test 3: TEST OK [0.000 secs, 4304 KB]
   Test 4: TEST OK [0.000 secs, 4304 KB]
   Test 5: TEST OK [0.011 secs, 4304 KB]
   Test 6: TEST OK [0.097 secs, 4304 KB]
   Test 7: TEST OK [1.264 secs, 4304 KB]
   Test 8: TEST OK [2.916 secs, 4304 KB]
   Test 9: TEST OK [2.549 secs, 4304 KB]

All tests OK.

Your program ('ariprog') produced all correct answers! This is your submission #4 for this problem. Congratulations!

Here are the test data inputs:

------- test 1 [length 4 bytes] ----
3
2
------- test 2 [length 4 bytes] ----
5
7
------- test 3 [length 6 bytes] ----
14
10
------- test 4 [length 6 bytes] ----
10
13
------- test 5 [length 6 bytes] ----
12
50
------- test 6 [length 7 bytes] ----
18
100
------- test 7 [length 7 bytes] ----
21
200
------- test 8 [length 7 bytes] ----
22
250
------- test 9 [length 7 bytes] ----
25
250
Keep up the good work!
Thanks for your submission!

AC代码:
/*
ID:maxkibb3
LANG:C++
PROG:ariprog
*/

#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;

int n, m;
vector<int> square_num;
bool is_sum[130000];

void make_square() {
	for(int i = 0; i <= m; i++) {
		square_num.push_back(i * i);
	}
	int ssize = square_num.size();
	for(int i = 0; i < ssize; i++) {
		for(int j = 0; j < ssize; j++) {
			is_sum[square_num[i] + square_num[j]] = true;
		}
	}
}

int main() {
	freopen("ariprog.in", "r", stdin);
	freopen("ariprog.out", "w", stdout);
	bool has_ans = false;
	scanf("%d%d", &n, &m);
	make_square();
	int up = 2*m*m / (n - 1);
	for(int i = 1; i <= up; i++) {
		for(int j = 0; j <= 2*m*m - i*(n-1); j++) {
			bool flag = true;
			int num = j - i; 
			for(int k = 0; k < n; k++) {
				num = num + i;
				if(!is_sum[num]) {
					flag = false;
					break;
				}
			}
			if(flag) {
				has_ans = true;
				printf("%d %d\n", j, i);
			}
		}
	}
	if(!has_ans) {
		printf("NONE\n");
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值