inlinevoidinit() { for (int i = 0; i < M; ++i) for (int j = 0; j < M; ++j) { A[i][j] = 0; if (i == j) A[i][j] = 1; } }
inline Matrix operator * (const Matrix &rhs) const { Matrix ans; for (int i = 0; i < M; ++i) for (int j = 0; j < M; ++j) { ans[i][j] = 0; for (int k = 0; k < M; ++k) Add (ans[i][j], (LL)A[i][k] * rhs.A[k][j] % Mod); } return ans; }
} trans;
inline Matrix Pow(Matrix a, int b) { Matrix ans; ans.init(); for (int i = b; i; i >>= 1, a = a * a) if (i & 1) ans = ans * a; return ans; }
inlinevoidInit() { int j = 0; for (int i = 2; i <= M; ++i) { while (j && A[j + 1] != A[i]) j = Next[j]; if (A[j + 1] == A[i]) ++j; Next[i] = j; }
for (int i = 0; i < M; ++i) { for (int j = 0; j <= 9; ++j) { int k = i; while (k && A[k + 1] != j) k = Next[k]; if (A[k + 1] == j) ++k; ++trans[i][k]; } } }
inlinevoidSolve() { Init (); Matrix res = Pow (trans, N);
int ans = 0; for (int i = 0; i < M; ++i) Add (ans, res[0][i]); cout << ans << endl; }
inlinevoidInput() { N = read<int>(), M = read<int>(), Mod = read<int>(); char S[Maxn]; scanf("%s", S + 1); for (int i = 1; i <= M; ++i) A[i] = S[i] - '0'; A[0] = 2003; A[M + 1] = 216; }