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
| #include <bits/stdc++.h> using namespace std;
const int N = 100, MOD = 2009; int n, m, T;
int pos(int i, int j) {return (i - 1) * 9 + j;}
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 = 1; i <= t.x; i++) for (int j = 1; j <= t.y; j++) for (int k = 1; k <= y; k++) t.f[i][j] = (1ll * t.f[i][j] + f[i][k] * 1ll * q.f[k][j]) % MOD; return t; } }; char s[N];
int main() { scanf("%d %d", &n, &T); Martix a(n * 9, n * 9); for (int i = 1; i <= n; i++) { for (int j = 1; j < 9; j++) a.f[pos(i, j)][pos(i, j + 1)] = 1; scanf("%s", s + 1); for (int j = 1; j <= n; j++) { int x = s[j] - '0'; if (x >= 1) a.f[pos(i, x)][pos(j, 1)] = 1; } } Martix ans(9 * n, 9 * n); for (int i = 1; i <= 9 * n; i++) ans.f[i][i] = 1; for (; T; T >>= 1, a = a * a) if (T & 1) ans = ans * a; printf("%d\n", ans.f[pos(1, 1)][pos(n, 1)]); return 0; }
|