比赛 HAOI2009 模拟试题2 评测结果 AAAAATTTTT
题目名称 着色方案 最终得分 50
用户昵称 lc 运行时间 0.000 s
代码语言 Pascal 内存使用 0.00 MiB
提交时间 2009-04-22 11:24:09
显示代码纯文本
program ex1;
  const
    maxprime=199997;
    Inf=1000000007;
  var
      n,m:      longint;
      ans:      qword;
      now:      integer;
      Ss,last,data:     qword;
      color:    array[1..15] of longint;
      state:        array[0..1,0..maxprime] of record
                    S,las:      qword;
                    end;
      tot:          array[0..1] of qword;
      link,next:         array[0..maxprime] of longint;
      sum:      array[0..1,0..maxprime] of qword;
      cheng:    array[0..16] of qword;
      anstate:      qword;


procedure Init;
  var
      i:        longint;
  begin
    readln(m);
    for i :=1 to m do read(color[i]);
    for i :=1 to m do n :=n+color[i];
    cheng[0]:=1;
    for i :=1 to 16 do cheng[i] :=cheng[i-1]*6;
  end;

procedure hash(Ss,last,data:qword);
  var
      t,pos:      qword;
  begin
    data :=data mod Inf;
    t :=Ss mod maxprime; pos :=link[t];
    while pos <> 0 do begin
      if  (state[now,pos].s=Ss) and (state[now,pos].las=last)
          then begin inc(sum[now,pos],data); sum[now,pos]:=sum[now,pos] mod Inf; exit end;
      pos :=next[pos];
      end;
      inc(tot[now]);  pos :=tot[now];
      state[now,pos].s :=Ss; state[now,pos].las:=last;  sum[now,pos] :=data ;
      next[pos] :=link[t]; link[t] :=pos;
  end;


procedure Main;
  var
      i,j,k,L:      longint;

  begin
    now :=0; hash(0,0,1);
    for i :=1 to m do anstate :=anstate+color[i]*cheng[i-1];
    for i :=1 to n do begin
        now :=1-now;  tot[now] :=0;
        fillchar(link,sizeof(link),0);
            for k :=1 to tot[1-now] do begin
                Ss:=state[1-now,k].s;  last :=state[1-now,k].las;  data :=sum[1-now,k];
                data :=data mod Inf ;
                for L :=1 to m do if last<>L then
                    if ((Ss div cheng[L-1]) mod 6<=color[L]) then
                       hash(Ss+cheng[L-1],L,data);
                end;
        end;

    for k :=1 to tot[now] do begin
        Ss:=state[now,k].s; data :=sum[now,k];
        if Ss=anstate then ans :=(ans+data) mod Inf;
        end;
     writeln(ans);
  end;


begin
  assign(input,'color.in'); reset(input);
  assign(output,'color.out'); rewrite(output);
  Init;
  Main;
  close(input); close(output);
end.