p2320.pas

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· PAS 代码 · 共 176 行

PAS
176
字号
PROGRAM p2320;

TYPE
        parr=^arr;
        arr=array[1..541]of Boolean;
        BigNum=array[0..100]of Integer;

VAR
        total,part,p,n,m,sa,sb  :Integer;
        prime,linkn,linkm       :array[1..100]of Integer;
        A                       :array[1..100,1..100]of 0..1;
        ans                     :BigNum;

PROCEDURE Print(var t:BigNum);
var
        i                       :Integer;
begin
for I:=t[0] downto 1 do write(t[i]);
writeln;
end;

PROCEDURE Mul(var t:BigNum;p:Integer);
var
        i,temp                  :Integer;
begin
temp:=0;
for i:=1 to t[0] do
        begin
        temp:=temp + t[i] * p;
        t[i]:=temp mod 10;
        temp:=temp div 10;
        end;
while (temp>0) do
        begin
        inc(t[0]);
        t[t[0]]:=temp mod 10;
        temp:=temp div 10;
        end;
end;

PROCEDURE MakePrime;
var
        i,j                     :Integer;
        num                     :Parr;
begin
getmem(num,sizeof(arr));
fillchar(num^,sizeof(arr),1);
total:=0;
i:=2;
for i:=2 to 541 do
        if num^[i] then
                begin
                inc(total);
                prime[total]:=i;
                for j:=2 to 541 div i do
                        num^[i*j]:=false;
                end;
freemem(num,sizeof(arr));
end;

PROCEDURE Readin;
var
        num                             :Longint;
        i,j                             :Integer;
begin
readln(m,n);
fillchar(A,sizeof(A),0);
for i:=1 to n do
        begin
        j:=1;
        read(num);
        while (j<=m) do
                if num mod prime[j]=0 then
                        begin
                        num:=num div prime[j];
                        A[i][j]:=(A[i][j]+1) mod 2;
                        end else inc(j);
        end;
readln;
end;

PROCEDURE Change(var a,b:Integer);
var
        temp                            :Integer;
begin
temp:=a;
a:=b;
b:=temp;
end;

FUNCTION Find(p:Integer):Boolean;
var
        i,j                             :Integer;
begin
Find:=true;
if (sa<>0)and(sb<>0) and (A[linkn[sa]][linkm[sb]]=1) then
        begin
        change(linkn[sa],linkn[p]);
        change(linkm[sb],linkm[p]);
        exit;
        end;
for i:=p to n do
        for J:=p to m do
                if A[linkn[i]][linkm[j]]=1 then
                        begin
                        change(linkn[i],linkn[p]);
                        change(linkm[j],linkm[p]);
                        exit;
                        end;
find:=false;
end;

PROCEDURE PrintMatrix;
var
        i,j                             :Integer;
begin
writeln('here is the matrix:');
for i:=1 to n do
        begin
        for j:=1 to m do write(a[linkn[i]][linkm[j]]);
        writeln;
        end;

end;

PROCEDURE main;
var
        i,j,k                           :Integer;
begin
for i:=1 to n do linkn[i]:=i;
for i:=1 to m do linkm[i]:=i;
i:=1;
sa:=0;sb:=0;
while (i<=n) do
        begin
        if find(i) then
                begin
                for j:=i+1 to n do
                        if A[linkn[j]][linkm[i]]=1 then
                                for k:=i to m do
                                        begin
                                        A[linkn[j]][linkm[k]]:=abs(A[linkn[j]][linkm[k]]-A[linkn[i]][linkm[k]]);
                                        if A[linkn[j]][linkm[k]]=1 then
                                                begin
                                                sa:=j;
                                                sb:=k;
                                                end;
                                        end;
                end else break;
        inc(i);
        end;
dec(n,i-1);
ans[1]:=1;
ans[0]:=1;
for i:=1 to n div 3 do
        mul(ans,8);
for i:=1 to n mod 3 do
        mul(ans,2);
dec(ans[1]);
if ans[1]=0 then writeln(0) else
        print(ans);
end;

BEGIN
//assign(input,'p.in');
//reset(input);
MakePrime;
readln(part);
for p:=1 to part do
        begin
        Readin;
        Main;
        if p<part then writeln;
        end;
END.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?