记录编号 601053 评测结果 AAAAAAAAAA
题目名称 1469.[ZJOI 2005] 沼泽鳄鱼 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 0.159 s
提交时间 2025-05-27 22:26:26 内存使用 1.83 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>

constexpr int MAXN = 50;
constexpr int MOD = 10000;

struct Matrix {
  int n, m;
  int a[MAXN][MAXN];
  Matrix() {
    memset(a, 0, sizeof a);
  }
  Matrix(int n, int m) : n(n), m(m) {
    memset(a, 0, sizeof a);
  }
  void E() {
    memset(a, 0, sizeof a);
    for (int i = 0; i < n; ++i) {
      a[i][i] = 1;
    }
  }
  int* operator[] (int val) {
    return a[val];
  }
};

Matrix operator * (Matrix x, Matrix y) {
  Matrix res(x.n, y.m);
  for (int k = 0; k < x.m; ++k) {
    for (int i = 0; i < x.n; ++i) {
      for (int j = 0; j < y.m; ++j) {
        res[i][j] = (res[i][j] + x[i][k] * y[k][j] + MOD) % MOD;
      }
    }
  }
  return res;
}

Matrix kasumi(Matrix a, int b) {
  Matrix res = a;
  res.E();
  while (b) {
    if (b & 1) res = res * a;
    b >>= 1;
    a = a * a;
  }
  return res;
}

int n, m, st, ed, k;
int nfish;

int main() {
  freopen("swamp.in", "r", stdin);
  freopen("swamp.out", "w", stdout);
  scanf("%d %d %d %d %d", &n, &m, &st, &ed, &k);

  Matrix g(n, n);
  for (int i = 1; i <= m; ++i) {
    int x, y;
    scanf("%d %d", &x, &y);
    g[x][y] = g[y][x] = 1;
  }

  Matrix a[13];
  for (int i = 0; i <= 12; ++i) {
    a[i] = g;
  }

  scanf("%d", &nfish);
  while (nfish--) {
    int t, p[4];
    scanf("%d", &t);
    for (int i = 0; i < t; ++i) {
      scanf("%d", &p[i]);
    }
    p[t] = p[0];

    for (int i = 1; i <= 12; ++i) {
      for (int j = 0; j < n; ++j) {
        a[i][j][p[(i - 1) % t + 1]] = 0;
      }
    }
  }

  a[0].E();
  for (int i = 1; i <= 12; ++i) {
    a[0] = a[0] * a[i];
  }

  Matrix ans = kasumi(a[0], k / 12);
  for (int i = 1; i <= k % 12; ++i) {
    ans = ans * a[i];
  }

  printf("%d\n", ans[st][ed]);
  return 0;
}