fork(10) download
  1. {
  2.  Author:wzx961008
  3.  Problem:HNOI 2011-homework
  4.  Verdict:Accepted
  5.  Language:PASCAL
  6.  Run Time:0.17s
  7.  AC Date:17.07.11
  8. }
  9. type matrix=array[1..3,1..3]of int64;
  10. var tmt,mt,ans,temp:matrix;
  11. n,time,pw:int64;
  12. i,m,dt:longint;
  13. function digit(n:int64):longint;
  14. var tn:int64;
  15. i:longint;
  16. begin
  17. i:=0; tn:=n;
  18. while tn>0 do begin
  19. tn:=tn div 10;
  20. i:=i+1;
  21. end;
  22. exit(i);
  23. end;
  24. procedure mul(m1,m2:matrix; var ret:matrix);
  25. var i,j,k:longint;
  26. sum:int64;
  27. begin
  28. for i:=1 to 3 do
  29. for j:=1 to 3 do begin
  30. sum:=0;
  31. for k:=1 to 3 do sum:=(sum mod m+((m1[i,k] mod m)*(m2[k,j] mod m)) mod m) mod m;
  32. ret[i,j]:=sum;
  33. end;
  34. end;
  35. procedure mmxp(n:int64; var ret:matrix);
  36. var tn:int64;
  37. i:longint;
  38. begin
  39. tn:=n;
  40. fillchar(ret,sizeof(ret),0);
  41. for i:=1 to 3 do ret[i,i]:=1;
  42. while tn>0 do begin
  43. if tn and 1=1 then mul(ret,tmt,ret);
  44. mul(tmt,tmt,tmt); tn:=tn>>1;
  45. end;
  46. end;
  47. begin
  48. readln(n,m);
  49. for i:=1 to 3 do ans[i,i]:=1;
  50. dt:=digit(n); pw:=1;
  51. for i:=1 to dt do begin
  52. mt[1,1]:=pw*10; mt[1,2]:=0; mt[1,3]:=0;
  53. mt[2,1]:=1; mt[2,2]:=1; mt[2,3]:=0;
  54. mt[3,1]:=1; mt[3,2]:=1; mt[3,3]:=1;
  55. tmt:=mt;
  56. if i<>dt then time:=9*pw
  57. else time:=n-pw+1;
  58. mmxp(time,temp);
  59. mul(ans,temp,ans);
  60. pw:=pw*10;
  61. end;
  62. writeln(ans[3,1]);
  63. end.
stdin
13 13
compilation info
Free Pascal Compiler version 2.2.0 [2009/11/16] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Linux for i386
Compiling prog.pas
Linking prog
62 lines compiled, 0.0 sec
stdout
4