比赛 |
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;
}