Arithmetic Progressions
等差数列
译 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
大家来看看我的程序 会不会有什么问题?
uses sysutils;
const max=1000000;
var f1,f2:text;pf:array[0..max] of boolean; i,j,k,a,b,m,n:longint;
q,p,l:longint; t0:tdatetime;
begin
t0:=now;
assign(f1,'E:\os\pp\bin\go32v2\dengcha.in');
assign(f2,'E:\os\pp\bin\go32v2\dengcha.out');
reset(f1);
rewrite(f2);
readln(f1,a);
readln(f1,b);
close(f1);
n:=b*b+b*b;
m:=(n div (a-1))+1;
for i:= 1 to n do pf
:=false;
for i:=0 to b do
for j:=0 to b do begin k:=i*i+j*j; pf[k]:=true;end;
for i:= 1 to m do begin
k:=1;
repeat
l:=k;
q:=0;p:=0;
repeat
if pf[l] then begin l:=l+i; p:=p+1;end
else q:=1;
until ((q=1) or (p=a));
if p=a then writeln(f2,k,' ',i);
k:=k+1;
until (n-k-m<3);
end;
writeln(f2,'Runtime is ',(now-t0)*86400:0:2,' seconds.');
close(f2);
end.