[GT]試験HNOI2008

質問が直面
https://www.luogu.org/problem/P3193

問題の解決策

// luogu-判定部イネーブル-O2 
の#include <cstdioを> 
する#include <iostreamの> 
する#include <CStringの>
 の#define riは整数レジスタ
 の#define N 50
 の#define LL長い長い 
 使用して 名前空間STDを、
INT NEX [N]、N、M、K。
チャーS [N]。

構造体行列{
   int型V [N] [N]。
  行列演算子 *(CONST行列&RHS)のconst { 
    マトリックスRET。
    ret.clear(); 
    (RI k = 0 ; K <M; ++ k個のために(RI I =0 ;私がm <; I ++ のための(RI J = 0 ; J <Mであり、j ++)(ret.v [I] [J] + = V [i]は[K] * rhs.v [K] [J] )%= K。
    リターンRET; 
  } 
  ボイドクリア(){ 
    memsetの(V、0はsizeof (V))。
  } 
}マット。

INT メイン(){ 
  scanf関数(" %D%D%D "、&​​N、&M、およびK); 
  scanf関数(" %sの"、S + 1 )。
  NEX [ 0 ] = NEXは、[ 1 ] = 0 (RI I = 2、I <= M; I ++){
     int型 J = NEX [I- 1 ]。
    一方、(J && S [J + 1!] = S [i])とJ = NEX [J]。
    もし(S [J + 1 ] == S [i])とJ ++ 
    NEX [I] = jは、
  } 
  mat.clear()。
  (RI i = 0 ; iが<M iが++ ){
     ため(RI C = ' 0 ' ; C <= ' 9 ' ; C ++ ){
       int型 J = I。
      一方、(J && S [J + 1!] = C)J = NEX [J]。
      もし(S [J + 1] == C)J ++ ; 
      mat.v [I] [J] ++ ; 
    } 
  } 

  マトリックスFAC。fac.clear(); 
  (RI i = 0 ; iがm <; iは++)fac.v [i]は[I] = 1 (; T; N >> = 1、マット=マット*マット)であれば(N - 1)FAC = FACの*のマット。
  // (RI i = 1; I <= N; iは++)のためのFAC = FACの*マット。
  int型 ANS = 0 ;
  (RI i = 0 ; iがmを<; iは++)(ANS + = fac.v [ 0 ] [I])%= K。
  coutの << ANS << てendl; 
}

 

おすすめ

転載: www.cnblogs.com/shxnb666/p/11279687.html