質問が直面
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; }