比赛 20251001国庆欢乐赛1 评测结果 WWWWWWTTTT
题目名称 信使 最终得分 0
用户昵称 LikableP 运行时间 21.332 s
代码语言 C++ 内存使用 4.60 MiB
提交时间 2025-10-01 09:49:14
显示代码纯文本
// O(q*n^3*log{d}) 60 pts
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;

ll MOD = 114514;
struct Matrix {
  int n, m;
  ll a[110][110];

  Matrix() {memset(a, 0, sizeof a);};
  Matrix(int n, int m) : n(n), m(m) {memset(a, 0, sizeof a);};
  Matrix(int n, int m, bool flag) : n(n), m(m) {
    memset(a, 0, sizeof a);
    for (int i = 1; i <= n; ++i) a[i][i] = 1;
  }
  Matrix(initializer_list<initializer_list<int>> initlist) {
    memset(a, 0, sizeof a);
    for (auto row : initlist) {
      ++n, m = 0;
      for (auto col : row) {
        a[n][++m] = col;
      }
    }
  }
  ll* operator[](int pos) {return a[pos];}
  Matrix Print() {
    cout << endl;
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= m; ++j) {
        cout << a[i][j] << " ";
      }
      cout << endl;
    }
    return *this;
  }
};

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

Matrix kasumi(Matrix x, int y) {
  Matrix res(x.n, x.m, true);
  while (y) {
    if (y & 1) res = res * x;
    y >>= 1;
    x = x * x;
  }
  return res;
}

int n, m, q;
Matrix G;

void work(int u, int v, int d) {
  Matrix G1(G), G2(G), G3(G); // no ending, no begining, no ending and begining;
  for (int i = 1; i <= n; ++i) G1[i][v] = G1[v][i] = 0;
  for (int i = 1; i <= n; ++i) G2[i][u] = G2[u][i] = 0;
  for (int i = 1; i <= n; ++i) G3[i][u] = G3[u][i] = G3[i][v] = G3[v][i] = 0;
  Matrix res = G1; // first step
  d--;
  if (d != 0) {
    res = res * kasumi(G3, d - 1); // middle steps
    d = 1;
  }
  res = res * G2; // last step
  
  cout << res[u][v] << endl;
}

int main() {
  freopen("messenger.in", "r", stdin);
  freopen("messenger.out", "w", stdout);
  cin.tie(0)->sync_with_stdio(false), cout.tie(0);
  cin >> n >> m >> MOD;
  G.n = n, G.m = n;
  for (int i = 1, a, b; i <= m; ++i) {
    cin >> a >> b;
    G[a][b] = G[b][a] = 1;
  }
  cin >> q;
  for (int u, v, d; q--;) {
    cin >> u >> v >> d;
    work(u, v, d);
  }
  return 0;
}