40分求调
查看原帖
40分求调
1058271
wangjunjie2012楼主2024/12/5 20:40

哪位大佬知道我哪错了(必关)

#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;
}
2024/12/5 20:40
加载中...