QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#869456#247. 州区划分lycc0 0ms47148kbC++203.6kb2025-01-25 09:48:002025-01-25 09:48:05

Judging History

This is the latest submission verdict.

  • [2025-01-25 09:48:05]
  • Judged
  • Verdict: 0
  • Time: 0ms
  • Memory: 47148kb
  • [2025-01-25 09:48:00]
  • Submitted

answer

// Author: lycc
// 
// Problem: P4221 [WC2018] 州区划分
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4221
// Memory Limit: 1000 MB
// Time Limit: 10000 ms

#include <bits/stdc++.h>
// #define int long long
#define lb lower_bound
#define ub upper_bound
#define fi first
#define se second
#define pb emplace_back
#define For(i, x, y) for (int i = (x); i <= (y); i ++)
#define rep(i, x, y) for (int i = (x); i >= (y); i --)
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
#define sz(v) (int)((v).size())
#define ull unsigned long long
#define ls (p << 1)
#define rs (p << 1 | 1)
#define mp make_pair
#define i128 __int128
#define db long double
#define vi vector< int >
#define mem(v, x) memset(v, x, sizeof(v))
#define A3 array< int, 3 >
#define A4 array< int, 4 >
#define vpii vector< pair< int, int > >
using namespace std;
mt19937_64 rnd(time(0));
template< typename T > void cmin(T &x, T y) { return x = min(x, y), void(); }
template< typename T > void cmax(T &x, T y) { return x = max(x, y), void(); }
int ksm(int x, int y, int p) {
    int v = 1; x %= p;
    while (y) v = 1ll * v * ((y & 1) ? x : 1) % p, x = 1ll * x * x % p, y >>= 1;
    return (v % p + p) % p;
}
void file() {
	freopen("1.in", "r", stdin);
	freopen("1.out", "w", stdout);
	return;
}
bool MemoryST;
const int N = 21;
const int mod = 998244353;
const long long INF = 1e18;
const int base = 13131;
using ll = long long;
int n, m, _, a[N], siz[1 << N], u[1000], v[1000], fa[N], val[1 << N], ans[1 << N];
int find(int x) {
	return fa[x] == x ? x : fa[x] = find(fa[x]);
}
vi pos[N + 1];
int todo[N + 1][1 << N], Val[N + 1][1 << N], Ans[N + 1][1 << N], deg[N];
void Main() {
	cin >> n >> m >> _;
	For (i, 1, m) cin >> u[i] >> v[i], u[i] --, v[i] --;
	For (i, 0, n - 1) cin >> a[i];
	For (s, 1, (1 << n) - 1) {
		int x = __lg(s & (-s));
		siz[s] = siz[s ^ (1 << x)] + a[x];
		For (i, 0, n - 1) deg[i] = 0, fa[i] = i;
		For (i, 1, m) {
			if (((s >> u[i]) & 1) && ((s >> v[i]) & 1)) {
				deg[u[i]] ++; deg[v[i]] ++;
				fa[find(u[i])] = find(v[i]);				
			}
		}
		bool flag = 0; int cnt = 0;
		For (i, 0, n - 1) {
			if ((s >> i) & 1) {
				if (find(i) == i) cnt ++;
				flag |= (deg[i] & 1);
			}
		}
		if (flag || cnt >= 2) {
			if (!_) val[s] = 1;
			if (_ == 1) val[s] = siz[s];
			if (_ == 2) val[s] = siz[s] * siz[s];
			ans[s] = val[s];
		}
		pos[__builtin_popcount(s)].pb(s);
		Val[__builtin_popcount(s)][s] = val[s];
	}
	For (S, 1, n) {
		For (i, 0, n - 1) {
			For (s, 0, (1 << n) - 1) {
				if ((s >> i) & 1) {
					(Val[S][s] += Val[S][s ^ (1 << i)]) %= mod;
				}
			}
		}
	}
	For (S, 1, n) {
		For (i, 0, n - 1) {
			For (s, 0, (1 << n) - 1) {
				if ((s >> i) & 1) {
					(todo[S][s] += mod - todo[S][s ^ (1 << i)]) %= mod;
				}
			}
		}
		for (int s : pos[S]) {
			(ans[s] += todo[S][s]) %= mod;
			ans[s] = 1ll * ans[s] * ksm(val[s], mod - 2, mod) % mod;
			Ans[S][s] = ans[s];
		}
		For (i, 0, n - 1) {
			For (s, 0, (1 << n) - 1) {
				if ((s >> i) & 1) {
					(Ans[S][s] += Ans[S][s ^ (1 << i)]) %= mod;
				}
			}
		}
		For (T, 1, n - S) {
			For (s, 0, (1 << n) - 1) {
				(todo[S + T][s] += 1ll * Ans[S][s] * Val[T][s] % mod) %= mod;
			}
		}
	}
	cout << ans[(1 << n) - 1];
    return;
}
bool MemoryED;
signed main() {
	// file();
    ios :: sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cerr << fixed << setprecision(6) << (&MemoryST - &MemoryED) / 1048576.0 << "MB\n";
    int TESTCNT = 1;
    // cin >> TESTCNT;
    while (TESTCNT --) Main();
    cerr << endl << 1e3 * clock() / CLOCKS_PER_SEC << "ms"; 
    return 0;
}

详细

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 26
Accepted
time: 0ms
memory: 26524kb

input:

5 4 2
3 1
4 1
5 1
4 3
94 45 77 43 3

output:

652834711

result:

ok 1 number(s): "652834711"

Test #2:

score: 0
Wrong Answer
time: 0ms
memory: 47148kb

input:

10 34 2
1 2
5 1
6 1
1 8
1 9
1 10
3 2
2 6
7 2
2 8
9 2
10 2
3 4
3 5
3 6
3 8
9 3
10 3
4 5
6 4
8 4
9 4
10 4
5 8
9 5
10 5
7 6
6 8
6 10
8 7
9 7
10 7
8 9
10 9
89 50 53 95 71 52 83 54 54 12

output:

498149938

result:

wrong answer 1st numbers differ - expected: '748246143', found: '498149938'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #1:

0%

Subtask #4:

score: 0
Skipped

Dependency #1:

0%