Arithmetic Progressions等差数列
一个等差数列是一个能表示成 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 17
13 12
17 12
5 20
2 24
================================
==========================
{
ID:jie19952
PROG:ariprog
LANG:PASCAL
}
type
re=record
a,d:longint;
end;
var
n,m:longint;
exist:array[0..125000]of boolean;
shu:array[0..125000]of longint;
ans:array[1..10000]of re;
ans_num:longint;
procedure init;
begin
assign(input,'ariprog.in');
assign(output,'ariprog.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure main;
var
i,j:longint;
a1,d1,n1,k1:longint;
flag:boolean;
begin
readln(n);
readln(m);
fillchar(exist,sizeof(exist),false);
for i:=0 to m do
for j:=i to m do
exist[i*i+j*j]:=true;
shu[0]:=0;
for i:=0 to 2*m*m do
if exist[i] then
begin
inc(shu[0]);
shu[shu[0]]:=i;
end;
ans_num:=0;
for j:=1 to shu[shu[0]] do //枚举d
for i:=1 to shu[0] do //枚举a
begin
a1:=shu[i];
d1:=j;
if a1+d1*(n-1)>shu[shu[0]] then break;
n1:=n-1;
flag:=true;
while n1>0 do
begin
a1:=a1+d1;
if not exist[a1] then
begin
flag:=false;
break;
end;
dec(n1);
end;
if flag then
begin
inc(ans_num);
ans[ans_num].a:=a1-d1*(n-1);
ans[ans_num].d:=j;
end;
end;
for i:=1 to ans_num do
begin
writeln(ans[i].a,' ',ans[i].d);
end;
if ans_num=0 then writeln('NONE');
end;
begin
init;
main;
terminate;
end.