比赛 HAOI2009 模拟试题2 评测结果 AAAAATTTTT
题目名称 着色方案 最终得分 50
用户昵称 lc 运行时间 0.000 s
代码语言 Pascal 内存使用 0.00 MiB
提交时间 2009-04-22 11:24:09
显示代码纯文本
  1. program ex1;
  2. const
  3. maxprime=199997;
  4. Inf=1000000007;
  5. var
  6. n,m: longint;
  7. ans: qword;
  8. now: integer;
  9. Ss,last,data: qword;
  10. color: array[1..15] of longint;
  11. state: array[0..1,0..maxprime] of record
  12. S,las: qword;
  13. end;
  14. tot: array[0..1] of qword;
  15. link,next: array[0..maxprime] of longint;
  16. sum: array[0..1,0..maxprime] of qword;
  17. cheng: array[0..16] of qword;
  18. anstate: qword;
  19.  
  20.  
  21. procedure Init;
  22. var
  23. i: longint;
  24. begin
  25. readln(m);
  26. for i :=1 to m do read(color[i]);
  27. for i :=1 to m do n :=n+color[i];
  28. cheng[0]:=1;
  29. for i :=1 to 16 do cheng[i] :=cheng[i-1]*6;
  30. end;
  31.  
  32. procedure hash(Ss,last,data:qword);
  33. var
  34. t,pos: qword;
  35. begin
  36. data :=data mod Inf;
  37. t :=Ss mod maxprime; pos :=link[t];
  38. while pos <> 0 do begin
  39. if (state[now,pos].s=Ss) and (state[now,pos].las=last)
  40. then begin inc(sum[now,pos],data); sum[now,pos]:=sum[now,pos] mod Inf; exit end;
  41. pos :=next[pos];
  42. end;
  43. inc(tot[now]); pos :=tot[now];
  44. state[now,pos].s :=Ss; state[now,pos].las:=last; sum[now,pos] :=data ;
  45. next[pos] :=link[t]; link[t] :=pos;
  46. end;
  47.  
  48.  
  49. procedure Main;
  50. var
  51. i,j,k,L: longint;
  52.  
  53. begin
  54. now :=0; hash(0,0,1);
  55. for i :=1 to m do anstate :=anstate+color[i]*cheng[i-1];
  56. for i :=1 to n do begin
  57. now :=1-now; tot[now] :=0;
  58. fillchar(link,sizeof(link),0);
  59. for k :=1 to tot[1-now] do begin
  60. Ss:=state[1-now,k].s; last :=state[1-now,k].las; data :=sum[1-now,k];
  61. data :=data mod Inf ;
  62. for L :=1 to m do if last<>L then
  63. if ((Ss div cheng[L-1]) mod 6<=color[L]) then
  64. hash(Ss+cheng[L-1],L,data);
  65. end;
  66. end;
  67.  
  68. for k :=1 to tot[now] do begin
  69. Ss:=state[now,k].s; data :=sum[now,k];
  70. if Ss=anstate then ans :=(ans+data) mod Inf;
  71. end;
  72. writeln(ans);
  73. end;
  74.  
  75.  
  76. begin
  77. assign(input,'color.in'); reset(input);
  78. assign(output,'color.out'); rewrite(output);
  79. Init;
  80. Main;
  81. close(input); close(output);
  82. end.