p2456.pas

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

PAS
140
字号
{$R-,I-,Q-}
PROGRAM p2456;

type

        Tans                    = array[1..10,0..2000] of Integer;
        Ta                      = array[0..2000] of Integer;
        TFirst                  = array[0..35, 0..35, 0..37] of Integer;

VAR
        f3                      : Text;
        N , B , Total           : Integer;
        ans                     : Tans;
        A                       : Ta;
        First                   : TFirst;


procedure makeFirst;
var
        i , j , k , d , x , y , e       : Integer;

function extended_gcd ( a , b : Integer ; var x , y : Integer ) : Integer;
var
        t                               : Integer;
begin
if a = 0 then
        begin
        extended_gcd    := b;
        x               := 1;
        y               := 0;
        end else
        begin
        extended_gcd    := extended_gcd ( b mod a , a , x , y );
        t               := x;
        x               := y;
        y               := t - ( b div a ) * y;
        end;
end;

begin
for i := 0 to B - 1 do
        begin
        d := extended_gcd ( i , B , y , x );
        for j := 0 to B - 1 do
                begin
                First [i] [j] [0] := 0;
                if j mod d = 0 then
                        begin
                        First [i] [j] [0] := d;
                        e := ( ( x + B ) * ( j div d ) ) mod B;
                        for k := 0 to d - 1 do
                                First [i] [j] [k + 1] := ( e + k * B div d ) mod B;
                        end;
                end;
        end;
end;

procedure init;
begin
Total := 0;
makeFirst;
end;

procedure search ( dep , r : Longint );
var
        i , sum , left , right                : Longint;
begin
if dep = n then
        begin
        if A [n - 1] <> 0 then
                begin
                inc ( total );
                for i := 0 to n - 1 do
                        ans [total] [i] := A [i];
                end;
        exit;
        end;

sum := r;
for i := 1 to dep - 1 do
        sum := sum + A [i] * A [dep - i];

left  := ( 2 * A [0] - 1 + B ) mod B;
right := ( B - ( sum mod B ) ) mod B;

for I := 1 to First [left] [right] [0] do
        begin
        A [dep] := First [left] [right] [i];
        search ( dep + 1 , ( ( 2 * A [0] - 1 ) * A [dep] + sum ) div B );
        end;
end;

procedure main;
var
        i , t                   : Integer;
begin
for i := 0 to B - 1 do
        begin
        A [0] := i;
        if sqr ( i ) mod B <> i mod B then continue;

        t := sqr ( i ) div B;
        search ( 1 , t );
        end;
end;

procedure print;
var
        i , j                    : Integer;
begin
if ( n = 1 ) then
        begin
        inc ( Total );
        ans [total] [0] := 0;
        end;

writeln ( Total );
for i := 1 to Total do
        begin
        for j := N - 1 downto 0 do
                if ans [i] [j] >= 10 then
                        write ( Char ( ans [i] [j] - 10 + ord ( 'A' ) ) )
                        else
                        write ( ans [i] [j] );
        writeln;
        end;
end;


BEGIN
//assign ( input ,'p.in' );
//reset ( input );
while not eof do
        begin
        readln ( B , N );
        init;
        main;
        print;
        end;
END.

⌨️ 快捷键说明

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