1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include <bits/stdc++.h> using namespace std;
const int N = 30; int n, m, MOD, f[N], mc[N][N]; char s[N];
struct Martix { int x, y, f[N][N]; Martix (int X, int Y) { x = X, y = Y; memset(f, 0, sizeof f); } Martix operator * (const Martix& q) const { Martix t(x, q.y); for (int i = 0; i < t.x; i++) for (int j = 0; j < t.y; j++) for (int k = 0; k < y; k++) t.f[i][j] = (1ll * t.f[i][j] + f[i][k] * 1ll * q.f[k][j]) % MOD; return t; } };
void kmp() { f[0] = -1; for (int i = 1; i <= m; ++i) { int j = f[i - 1]; while (s[j + 1] != s[i] && j != -1) j = f[j]; f[i] = j + 1; } f[0] = 0; for (int i = 0; i < m; i++) { for (int j = '0'; j <= '9'; j++) { int tmp = i; while (s[tmp + 1] != j && tmp > 0) tmp = f[tmp]; if (s[tmp + 1] == j) tmp++; mc[i][tmp]++; } } }
Martix fpow(Martix c, int b) { Martix res(m, m); for (int i = 0; i <= m; i++) res.f[i][i] = 1; for (; b; b >>= 1, c = c * c) if (b & 1) res = c * res; return res; }
int main() { scanf("%d %d %d", &n, &m, &MOD); scanf("%s", s + 1); kmp(); Martix g(m, m), a(m, 1); a.f[0][0] = 1; for (int i = 0; i <= m; i++) for (int j = 0; j <= m; j++) g.f[i][j] = mc[i][j]; g = fpow(g, n); a = a * g; int ans = 0; for (int i = 0; i < m; i++) ans = (ans + a.f[0][i]) % MOD; printf("%d\n", ans); return 0; }
|