哪位大佬知道我哪错了(必关)
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 305, M = 2 * N, W = 1000000000;
const ll mod = 998244353;
char s[66];
int X[M], Y[M];
ll Z[M];
__int128 F[N][N][N], f[N][2 * N * N];
const __int128 inf = (((__int128)0x3f3f3f3f3f3f3f3fll) << 64) | 0x3f3f3f3f3f3f3f3f;
__int128 min(__int128 a, __int128 b) {
return a < b ? a : b;
}
__int128 wCmin[N];
int lenCmin[N];
struct Answer {
__int128 a, b;
int c;
} g[N][N];
Answer inf_ans() {
Answer ans;
ans.a = 0;
ans.b = 1;
ans.c = 0;
return ans;
}
Answer operator += (Answer & a, const __int128 & b) {
a.b += a.c * b;
return a;
}
Answer operator + (const Answer & a, const __int128 & b) {
Answer c = a;
return c += b;
}
__int128 ck;
bool operator < (const Answer & a, const Answer & b) {
if (a.c == 0) {
return false;
}
if (b.c == 0) {
return true;
}
const __int128 & a1 = a.a;
const __int128 & b1 = a.b;
const int & c1 = a.c;
const __int128 & a2 = b.a;
const __int128 & b2 = b.b;
const int & c2 = b.c;
__int128 up = b2 * c1 - b1 * c2, down = a1 * c2 - a2 * c1;
if (down == 0) {
return up > 0;
}
if (up == 0) {
return false;
}
if (up > 0 && down < 0) {
return true;
}
if (up > 0 && down > 0) {
return ck <= (up - 1) / down;
}
if (up < 0 && down > 0) {
return false;
}
return ck >= (-up - down) / (-down);
}
Answer min(const Answer & a, const Answer & b) {
return a < b ? a : b;
}
ll pow(ll a, ll b) {
ll ans = 1;
while (b != 0) {
if (b % 2 == 1) {
ans = ans * a % mod;
}
a = a * a % mod;
b = b / 2;
}
return ans;
}
ll inv(ll x) {
return x == 1 ? 1 : (mod - mod / x) * inv(mod % x) % mod;
}
ll k_mod_i[N];
void solve() {
int n, m;
scanf("%d %d %s", &n, &m, s);
ck = 0;
for (int i = 0; s[i] != '\0'; i++) {
ck = min(inf, min(ck * 2, inf) * 5 + s[i] - '0');
}
for (int i = 1; i <= n; i++) {
k_mod_i[i] = 0;
for (int j = 0; s[j] != '\0'; j++) {
k_mod_i[i] = (k_mod_i[i] * 10 + s[j] - '0') % i;
}
}
for (int u = 1; u <= n; u++) {
for (int v = 1; v <= n; v++) {
if (u == v) {
F[u][v][0] = 0;
} else {
F[u][v][0] = inf;
}
}
}
for (int i = 1; i <= m; i++) {
scanf("%d %d %lld", &X[i], &Y[i], &Z[i]);
}
for (int k = 1; k <= n; k++) {
for (int u = 1; u <= n; u++) {
for (int v = 1; v <= n; v++) {
F[u][v][k] = inf;
}
}
for (int u = 1; u <= n; u++) {
for (int i = 1; i <= m; i++) {
F[u][Y[i]][k] = min(F[u][Y[i]][k], F[u][X[i]][k - 1] + Z[i]);
}
}
}
for (int k = 0; k <= n; k++) {
for (int u = 1; u <= n; u++) {
f[u][k] = F[1][u][k];
}
}
for (int k = n + 1; k <= n * n; k++) {
for (int u = 1; u <= n; u++) {
f[u][k] = inf;
}
for (int i = 1; i <= m; i++) {
f[Y[i]][k] = min(f[Y[i]][k], f[X[i]][k - 1] + Z[i]);
}
}
if (ck <= 2 * n * n) {
for (int k = n * n + 1; k <= 2 * n * n; k++) {
for (int u = 1; u <= n; u++) {
f[u][k] = inf;
}
for (int i = 1; i <= m; i++) {
f[Y[i]][k] = min(f[Y[i]][k], f[X[i]][k - 1] + Z[i]);
}
}
for (int u = 1; u <= n; u++) {
if (f[u][ck] == inf) {
printf("-1 ");
} else {
printf("%lld ", (ll)(f[u][ck] % mod));
}
}
printf("\n");
return;
}
for (int u = 1; u <= n; u++) {
wCmin[u] = 1;
lenCmin[u] = 0;
}
for (int u = 1; u <= n; u++) {
for (int i = 1; i <= n; i++) {
if (F[u][u][i] != inf) {
if (F[u][u][i] * lenCmin[u] < i * wCmin[u]) {
wCmin[u] = F[u][u][i];
lenCmin[u] = i;
}
}
}
}
for (int i = 0; i < n; i++) {
for (int u = 1; u <= n; u++) {
g[i][u] = inf_ans();
}
}
for (int i = n * n - n + 1; i <= n * n; i++) {
for (int v = 1; v <= n; v++) {
if (lenCmin[v] != 0 && f[v][i] != inf) {
int x = (k_mod_i[lenCmin[v]] - i % lenCmin[v] + lenCmin[v]) % lenCmin[v];
int d = x + (n * n - x) / lenCmin[v] * lenCmin[v];
Answer now;
now.a = wCmin[v];
now.b = -(__int128)(i + d) * wCmin[v];
now.c = lenCmin[v];
g[d % n][v] = min(g[d % n][v], now + f[v][i]);
}
}
}
for (int i = n * n; i > 0; i--) {
for (int j = 1; j <= m; j++) {
if (g[i % n][X[j]].c != 0) {
g[(i - 1) % n][Y[j]] = min(g[(i - 1) % n][Y[j]], g[i % n][X[j]] + Z[j]);
}
}
for (int u = 1; u <= n; u++) {
g[i % n][u] = inf_ans();
}
}
ll kmod = 0;
for (int i = 0; s[i] != '\0'; i++) {
kmod = (kmod * 10 + s[i] - '0') % mod;
}
for (int u = 1; u <= n; u++) {
if (g[0][u].c != 0) {
ll a = g[0][u].a % mod;
ll b = (g[0][u].b % mod + mod) % mod;
ll c = g[0][u].c % mod;
printf("%lld ", (a * kmod + b) % mod * inv(c) % mod);
} else {
printf("-1 ");
}
}
printf("\n");
}
int main() {
int T;
scanf("%*d\n%d", &T);
for (; T != 0; T--) {
solve();
}
return 0;
}