Một vòng tròn chứa 2n vòng tròn nhỏ (Xem hình vẽ). Các vòng tròn nhỏ được đánh số từ 1 đến n theo chiều kim đồng hồ. Cần điền các số tự nhiên từ 1 đến 2n mỗi số vào một vòng tròn nhỏ sao cho tổng của hai số trên hai vòng tròn nhỏ liên tiếp là số nguyên tố. Số điền ở vòng tròn nhỏ 1 luôn là số 1.
input
Số nguyên dương n ( 1 < n < 10 ) .
Output
Dòng đầu tiên ghi ra số k là số cách tìm được.
K dòng tiếp theo mỗi dòng ghi ra 1 cách điền các số vào các vòng tròn nhỏ. Cách điền nào có thứ tự từ điển nhỏ hơn thì xếp trước. Nếu K > 10000 thì chỉ cần ghi ra 10000 cách đầu tiên.
Ví dụ
Input:
4
Output:
4
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
mọi người giúp mình tìm lỗi đoạn code của bài trên với ạ
const fi ='';
fo='';
type vector = array[1..20] of byte;
var n:longint; f:text;
x,d:vector;
snt:array[1..50] of boolean;
lutu:array[1..10000] of vector;
k,dem,i,j,s:longint;
procedure ssnt;
var j,i:longint;
begin
fillchar(snt,sizeof(snt),true);
for i:= 2 to trunc(sqrt(50)) do
if snt[i] then
begin
j:= i*i;
while j<=50 do
begin
snt[j]:= false;
j:= j+i;
end;
end;
end;
procedure update;
begin
if (snt[s+1]= false) then exit;
inc(k);
if k>10000 then exit;
dem:=k;
lutu[k]:= x;
end;
procedure vsnt(i:longint);
var j:longint;
begin
for j:= 2 to 2*n do
if d[j]=0 then
begin
x[i]:= j;
d[j]:= 1;
s:= x[i-1]+x[i];
if (snt[s]=true) then
if i=2*n then update
else vsnt(i+1);
d[x[i]]:= 0;
end;
end;
procedure init;
begin
k:= 0 ;
x[1]:= 1;
fillchar(d,sizeof(d),0);
ssnt;
vsnt(2);
end;
procedure doctep;
begin
assign(f,fi);reset(f);
readln(f,n);
init;
close(f);
end;
procedure ghitep;
begin
assign(f,fo);rewrite(f);
writeln(f,k);
for i:= 1 to dem do
begin
for j:= 1 to 2*n do write(f,lutu[i][j],' ');
writeln(f);
end;
end;
begin
doctep;
ghitep;
end.