记录编号 414604 评测结果 AAAAAAAAAA
题目名称 [HNOI 2008]GT考试 最终得分 100
用户昵称 GravatarHzoi_Mafia 是否通过 通过
代码语言 C++ 运行时间 0.022 s
提交时间 2017-06-14 17:08:37 内存使用 0.32 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. int n,m,mod;
  6. char s[25];
  7. int kp[25];
  8. inline void get_kp(){
  9. kp[0]=0;
  10. kp[1]=0;
  11. int k(0);
  12. for(int i=2;i<=m;i++){
  13. while(k&&s[k]!=s[i-1])
  14. k=kp[k];
  15. if(s[k]==s[i-1])
  16. k++;
  17. kp[i]=k;
  18. }
  19. }
  20. struct node{
  21. int data[25][25];
  22. node(){
  23. memset(data,0,sizeof(data));
  24. }
  25. node operator*(node &a){
  26. node tmp;
  27. for(int i=0;i<m;i++)
  28. for(int j=0;j<m;j++){
  29. tmp.data[i][j]=0;
  30. for(int k=0;k<m;k++){
  31. tmp.data[i][j]+=(data[i][k]*a.data[k][j]);
  32. tmp.data[i][j]%=mod;
  33. }
  34. }
  35. return tmp;
  36. }
  37. node operator*=(node &a){
  38. *this=*this*a;
  39. return *this;
  40. }
  41. }a,sing;
  42. ostream& operator<<(ostream &out,node &a){
  43. for(int i=0;i<m;i++){
  44. for(int j=0;j<m;j++)
  45. out<<a.data[i][j]<<' ';
  46. out<<endl;
  47. }
  48. return out;
  49. }
  50. int main(){
  51. freopen("bzoj_1009.in","r",stdin);
  52. freopen("bzoj_1009.out","w",stdout);
  53. scanf("%d%d%d%s",&n,&m,&mod,s);
  54. get_kp();
  55. for(int i=0;i<m;i++)
  56. for(int j=0;j<=9;j++){
  57. int k(i);
  58. while(k&&(j+'0')!=s[k])
  59. k=kp[k];
  60. if(j+'0'==s[k])
  61. k++;
  62. if(k!=m){
  63. a.data[i][k]++;
  64. a.data[i][k]%=mod;//cout<<'*';
  65. }
  66. }//cout<<a<<endl;
  67. /*for(int i=0;i<m;i++){
  68. for(int j=0;j<m;j++)
  69. cout<<a[i][j]<<' ';
  70. cout<<'\n';
  71. }*/
  72. for(int i=0;i<m;i++)
  73. sing.data[i][i]=1;
  74. int tmp(n);
  75. while(tmp){
  76. if(tmp&1)
  77. sing*=a;
  78. a*=a;
  79. //cout<<tmp<<endl;
  80. //cout<<a<<endl<<sing<<endl;
  81. tmp>>=1;
  82. }
  83. int ans(0);
  84. for(int i=0;i<m;i++){
  85. ans=(ans+sing.data[0][i])%mod;
  86. //cout<<ans<<endl;
  87. }
  88. cout<<ans;
  89. //while(1);
  90. }