PCIRCLE - Vòng số nguyên tố

Tác giả: ladpro98

Ngôn ngữ: Pascal

program pcircle;
uses    math;
const   a :array[1..9] of longint = (1,2,2,4,96,1024,2880,81024,770144);
var     res:array[1..20] of longint;
        check:array[1..20] of boolean;
        n,k:longint;
        done:boolean;


function isPrime(x:longint):boolean;
var     k,n:longint;
begin

        n:=x;
        if (n=2) or (n=3) or (n=5) or (n=7) then exit(true);
        if n mod 2 = 0 then exit(false);
        if (n mod 3 = 0) then exit(false);
        k:=0;

        while k<=trunc(sqrt(n)) do
        begin
                inc(k,6);
                if (n mod (k-1) = 0 ) or (n mod (k+1) = 0) then exit(false);
        end;
        isPrime:=true;
end;

procedure print;
var     i:longint;
begin
        for i:=1 to n do
        write(res[i],' ');
        writeln;
end;

procedure back(i,val:longint);
var     j:longint;
begin
        if done then exit;
        if i>n then
        begin
                if (isprime(val+res[1])) then
                begin
                        inc(k);
                        if k>10000 then done:=true
                        else
                        print;
                end;
                exit;
        end;
        for j:=1 to n do
        if (not check[j]) and isprime(val+j) then
        begin
                 check[j]:=true;
                 res[i]:=j;
                back(i+1,j);
                check[j]:=false;
        end;
end;

begin

        readln(n);
        fillchar(check,sizeof(check),false);
        k:=0;
        n:=2*n;
        res[1]:=1;
        check[1]:=true;
        writeln(a[n div 2]);
        back(2,1);

end.

Download