您的位置:首页 > 其它

usaco Arithmetic Progressions

2011-06-05 22:06 190 查看
等差数列
译 by tim green
一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)
在这个问题中a是一个非负的整数,b是正整数。
写一个程序来找出在双平方数集合S中长度为n的等差数列。
双平方数集合是所有能表示成p2+q2的数的集合。

PROGRAM NAME: ariprog

INPUT FORMAT

第一行:N(3<= N<=25),要找的等差数列的长度。
第二行:M(1<= M<=250),搜索双平方数的上界0 <= p,q <= M。
SAMPLE INPUT (file ariprog.in)
5
7

OUTPUT FORMAT
如果没有找到数列,输出`NONE'。
如果找到了,输出一行或多行, 每行由于二个整数组成:a,b
这些行应该先按b排序再按a排序。
将不会有只多于10,000个等差数列。

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

代码:

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
bool s[125001] = {false};
struct squre
{
int a,b;
};
queue<squre> q;
int main(void)
{
int i,j;
int n,m,a,b;
squre t;
scanf("%d %d",&n,&m);
for(i=0; i<=m; i++)
for(j=0; j<=m; j++)
s[i*i+j*j] = 1;
m = m*m*2;
for(b=1; ; b++)
{
if(b*(n-1)>m)
break;
for(a=0; ; a++)
{
if((a+b*(n-1))>m)
break;
for(i=0; i<n; i++)
if(!s[a+b*i])
break;
if(i>=n)
{
t.a = a;
t.b = b;
q.push(t);
}
}
}
bool flag = false;
if(!q.empty())
flag = true;
while(!q.empty())
{
t = q.front();
printf("%d %d/n",t.a,t.b);
q.pop();
}
if(!flag)
printf("NONE/n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: