又是一道淼题!淼淼淼!
枚举公差,首项
再对公差和首项进行判断。
枚举小技巧:
1,先枚举公差,避免O(n log n)排序;
2,公差只需枚举至m*m*2 div (n-1);
3,可提前对面末位进行判断(水法卡)
时间复杂度最高三亿九千万,但能过.....
187221 | 1251 | 2017王誉达 | 评测通过 100 | 757 ms | 7.79 MB | Pascal | 1682 bytes | 2017-08-09 14:50:23 |
标程(请勿抄袭):
var
i,j,k,m,n,o,p,l,s,t:longint;
bz:array[0..1000000] of longint;
a:array[0..1000000] of longint;
procedure qsort(l,r:longint);
var
i,j,mid:longint;
begin
i:=l;j:=r;mid:=a[(l+r) div 2];
repeat
while a[i]<mid do inc(i);
while a[j]>mid do dec(j);
if i<=j then begin
k:=a[i];
a[i]:=a[j];
a[j]:=k;
inc(i);dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
begin
readln(n);
readln(m);
for i:=0 to m do
for j:=0 to m do
begin
if bz[i*i+j*j]=0 then begin
inc(a[0]);
a[a[0]]:=i*i+j*j;
bz[i*i+j*j]:=1;
end;
end;
qsort(1,a[0]);
s:=0;
for i:=1 to m*m*2 div (n-1) do
for j:=1 to a[0] do begin
t:=0;
if bz[a[j]+i*(n-1)]=0 then continue;
for k:=1 to n-1 do begin
if bz[a[j]+i*k]=0 then begin
t:=1;
break;
end;
end;
if t=0 then begin
writeln(a[j],' ',i);
s:=1;
end;
end;
if s=0 then writeln('NONE');
end.