program magicball;
const maxn=4000;
var g:array[0..maxn,0..maxn]of longint;
f:array[0..maxn,0..maxn]of boolean;
que,d:array[0..maxn]of longint;
v:array[0..maxn]of boolean;
n,m:longint;
procedure add(x,m:longint);
var i,u:longint;
begin
u:=x shl 1;
g[0][u]:=1;
g[u xor 1][1]:=1;
for i:=1 to m-1 do
if sqr(trunc(sqrt(x+i)))=x+i then
begin
g[i shl 1][u xor 1]:=1;
f[i shl 1][u xor 1]:=true;
end;
end;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
function bfs(s,t:longint):boolean;
var l,r,u,i:longint;
begin
fillchar(v,sizeof(v),false);
fillchar(d,sizeof(d),0);
fillchar(que,sizeof(que),0);
l:=0;r:=1;que[l]:=s;v[s]:=true;
while l<r do
begin
u:=que[l];
for i:=0 to m shl 1 xor 1 do
if (g[u][i]>0)and(not v[i]) then
begin
que[r]:=i;
inc(r);
d[i]:=d[u]+1;
v[i]:=true;
end;
inc(l);
end;
exit(v[t]);
end;
function dfs(p,a,t:longint):longint;
var f,flow,i:longint;
begin
if (a=0)or(p=t) then exit(a);
flow:=0;
for i:=0 to m shl 1 xor 1 do
if (g[p][i]>0)and(d[i]=d[p]+1) then
begin
f:=dfs(i,min(g[p][i],a),t);
if f=0 then continue;
inc(flow,f);
dec(g[p][i],f);
inc(g[i][p],f);
dec(a,f);
if a=0 then break;
end;
exit(flow);
end;
function dinic(s,t:longint):longint;
var maxflow:longint;
begin
maxflow:=0;
while bfs(s,t) do
maxflow:=maxflow+dfs(s,maxlongint,t);
exit(maxflow);
end;
procedure print(p:longint);
var i:longint;
begin
write(p,' ');v[p shl 1]:=true;
for i:=1 to m do
if (g[p shl 1][i shl 1 xor 1]=0)and(f[p shl 1][i shl 1 xor 1])then
print(i);
end;
procedure init;
var i,flow,min,now:longint;
begin
read(n);
for m:=1 to n do add(m,m);
fillchar(f,sizeof(f),false);
flow:=0;
min:=n;
repeat
flow:=dinic(0,1);
min:=min-flow;
if min>n then break;
inc(m);
inc(min);
add(m,m);
until false;
dec(m);
writeln(m);
fillchar(g,sizeof(g),0);
for i:=1 to m do add(i,i);
flow:=dinic(0,1);
fillchar(v,sizeof(v),false);
for i:=1 to m do
if not v[i shl 1] then begin print(i);writeln;end;
end;
begin
assign(output,'f.out');rewrite(output);
init;
close(output);
end.
评论