又是一道淼題!淼淼淼!
枚舉公差,首項
再對公差和首項進行判斷。
枚舉小技巧:
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.