⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p160.dpr

📁 zhy关于acm.sgu.ru的OJ上题目的参考程序。 包含了里面大部分的题目
💻 DPR
字号:
{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE GUI}
{$R+,Q+,S+}
Const
    InFile     = 'p160.in';
    OutFile    = 'p160.out';
    Limit      = 1000;
    LimitN     = 10000;

Type
    Tlevel     = array[1..LimitN] of integer;
    Tdata      = array[1..Limit] of integer;
    Topt       = array[0..Limit , 0..Limit] of
                   record
                       father , times        : integer;
                       ok                    : boolean;
                   end;
    Tmodnum    = array[0..Limit * Limit] of integer;

Var
    level      : Tlevel;
    data ,
    usetimes   : Tdata;
    opt        : Topt;
    modnum     : Tmodnum;
    N , M ,
    answer     : integer;

procedure init;
var
    i          : integer;
begin
    fillchar(level , sizeof(level) , 0);
    fillchar(data , sizeof(data) , 0);
    fillchar(opt , sizeof(opt) , 0);
    opt[0 , 1].ok := true;
//    assign(INPUT , InFile); ReSet(INPUT);
      read(N , M);
      for i := 1 to N do
        begin
            read(level[i]);
            inc(data[level[i]]);
        end;
//    Close(INPUT);
end;

procedure work;
var
    i , j , k ,
    tmp ,
    power      : integer;
begin
    for i := 0 to M * M do
      modnum[i] := i mod M;

    for i := 1 to M - 1 do
      begin
          power := 1;
          for j := 0 to data[i] do
            begin
                for k := 0 to M - 1 do
                  if opt[i - 1 , k].ok then
                    begin
                        tmp := modnum[k * power];
                        if not opt[i , tmp].ok then
                          begin
                              opt[i , tmp].ok := true;
                              opt[i , tmp].father := k;
                              opt[i , tmp].times := j;
                          end;
                    end;
                power := modnum[power * i];
            end;
      end;

    answer := M - 1;
    while not opt[M - 1 , answer].ok do
      dec(answer); 
end;

procedure out;
var
    step , i   : integer;
begin
    fillchar(usetimes , sizeof(usetimes) , 0);
//    assign(OUTPUT , OutFile); ReWrite(OUTPUT);
      writeln(answer);
      step := M - 1;
      while step <> 0 do
        begin
            usetimes[step] := opt[step , answer].times;
            answer := opt[step , answer].father;
            dec(step);
        end;
      for i := 1 to N do
        if usetimes[level[i]] > 0 then
          begin
              dec(usetimes[level[i]]);
              write(i , ' ');
          end;
      writeln;
//    Close(OUTPUT);
end;

Begin
    init;
    work;
    out;
End.

⌨️ 快捷键说明

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