제출 #1364392

#제출 시각아이디문제언어결과실행 시간메모리
1364392jinhan814Dubai Chewy Cookie (KAISTRUN26SPRING_C)C++20
100 / 100
16 ms2600 KiB
#include <bits/stdc++.h>
using namespace std;

using i64 = long long;

constexpr int mod = 998'244'353;

constexpr int add(int a, int b) {
	return a + b < mod ? a + b : a + b - mod;
}

constexpr int sub(int a, int b) {
	return a < b ? a - b + mod : a - b;
}

constexpr int mul(int a, int b) {
	return i64(a) * b % mod;
}

constexpr int pow(int x, int n) {
	int ret = 1;
	for (; n; n >>= 1) {
		if (n & 1) ret = mul(ret, x);
		x = mul(x, x);
	}
	return ret;
}

auto sol = [](int n, int m, int q, auto v, auto adj, auto qs) {
	vector c1(n + 1, false);
	vector c2(n + 1, false);
	c1[1] = true;
	c2[2] = true;
	for (int i : adj[1]) c1[i] = true;
	for (int i : adj[2]) c2[i] = true;
	vector dp1(n + 1, 0);
	vector dp2(n + 1, 0);
	vector dp3(n + 1, 0);
	dp1[0] = 1;
	dp2[0] = 1;
	dp3[0] = 1;
	for (int i = 1; i <= n; i++) {
		if (c1[i] && c2[i]) {
			vector ndp(n + 1, 0);
			for (int x = 0; x <= n - 1; x++) {
				ndp[x] = add(ndp[x], mul(dp3[x], sub(1, v[i])));
				ndp[x + 1] = add(ndp[x + 1], mul(dp3[x], v[i]));
			}
			dp3.swap(ndp);
		}
		else if (c1[i]) {
			vector ndp(n + 1, 0);
			for (int x = 0; x <= n - 1; x++) {
				ndp[x] = add(ndp[x], mul(dp1[x], sub(1, v[i])));
				ndp[x + 1] = add(ndp[x + 1], mul(dp1[x], v[i]));
			}
			dp1.swap(ndp);
		}
		else if (c2[i]) {
			vector ndp(n + 1, 0);
			for (int x = 0; x <= n - 1; x++) {
				ndp[x] = add(ndp[x], mul(dp2[x], sub(1, v[i])));
				ndp[x + 1] = add(ndp[x + 1], mul(dp2[x], v[i]));
			}
			dp2.swap(ndp);
		}
	}
	auto calc = [&](int x, int y) {
		int ret = 0;
		for (int i = 0; i <= n; i++) {
			if (i > x || i > y) break;
			int val = mul(dp1[x - i], dp2[y - i]);
			val = mul(val, dp3[i]);
			ret = add(ret, val);
		}
		return ret;
	};
	vector ret(q, 0);
	for (int i = 0; i < q; i++) {
		auto [x, y] = qs[i];
		ret[i] = calc(x, y);
	}
	return ret;
};

int main() {
	cin.tie(0)->sync_with_stdio(0);
	int n, m, q; cin >> n >> m >> q;
	vector v(n + 1, 0);
	vector adj(n + 1, vector(0, 0));
	vector qs(q, array{ 0, 0 });
	for (int i = 1; i <= n; i++) {
		cin >> v[i];
	}
	for (int i = 0; i < m; i++) {
		int a, b; cin >> a >> b;
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	for (int i = 0; i < q; i++) {
		cin >> qs[i][0] >> qs[i][1];
	}
	auto res = sol(n, m, q, v, adj, qs);
	for (int i = 0; i < q; i++) {
		cout << res[i] << '\n';
	}
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…