QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#869456 | #247. 州区划分 | lycc | 0 | 0ms | 47148kb | C++20 | 3.6kb | 2025-01-25 09:48:00 | 2025-01-25 09:48:05 |
Judging History
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%