QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#302235#5827. 异或图zqs30 17ms3704kbC++143.1kb2024-01-10 17:55:292024-01-10 17:55:29

Judging History

你现在查看的是最新测评结果

  • [2024-01-10 17:55:29]
  • 评测
  • 测评结果:30
  • 用时:17ms
  • 内存:3704kb
  • [2024-01-10 17:55:29]
  • 提交

answer

#include <cstdio>
#include <cstring>
#include <algorithm>

typedef long long ll;
const int mod = 998244353;
inline void mns(int &x, const int y) {if ((x -= y) < 0) x += mod;}
int pow3[17], dp[14348911], to3[1 << 15 | 1], coef[1 << 15 | 1], popcnt[1 << 15 | 1], n, m;
ll a[15], C;
bool mp[15][15], OK[1 << 15 | 1];
int Mn[1 << 15 | 1];
inline int dig(int S, int i) {S %= pow3[i + 1]; return S / pow3[i];}
int solve(int S) {//S中的数异或和为C
	int ans = 0; ll sumxor = 0;
	for (int i = 0; i < n; ++ i) if (S & 1ll << i) sumxor ^= a[i];
	ans += sumxor == C;
	for (int i = 60; i >= 0; -- i) {//第i位出现不同 
		sumxor = 0;
		for (int j = 0; j < n; ++ j) if (S & 1 << j) sumxor ^= a[j] - (a[j] & (1ll << i + 1) - 1);
		if (sumxor != C - (C & (1ll << i + 1) - 1)) break;
		int f[2][2];
		f[0][0] = 1, f[0][1] = f[1][0] = f[1][1] = 0;
		for (int j = 0; j < n; ++ j) if (S & 1 << j) {
			int t1 = ((a[j] & (1ll << i) - 1) + 1) % mod, t2 = (a[j] & 1ll << i ? (1ll << i) % mod : 0);
			int g[2][2]; g[0][0] = g[0][1] = g[1][0] = g[1][1] = 0;
			for (int x = 0; x <= 1; ++ x) {
				g[0][x] = 1ll * f[0][x ^ (a[j] >> i & 1)] * t1 % mod;
				g[1][x] = (1ll * f[1][x ^ (a[j] >> i & 1)] * t1 +
				1ll * f[0][x] * (a[j] >> i & 1) + 1ll * f[1][x] * t2) % mod;
			}
			memcpy(f, g, sizeof f);
		}
		ans = (ans + f[1][C >> i & 1]) % mod;
	}
	return ans;
}

int main() {
	scanf("%d%d%lld", &n, &m, &C);
	pow3[0] = 1;
	for (int i = 1; i <= n; ++ i) pow3[i] = 3 * pow3[i - 1];
	for (int i = 0; i < n; ++ i) scanf("%lld", a + i);
	for (int i = 1, u, v; i <= m; ++ i) scanf("%d%d", &u, &v), -- u, -- v, mp[u][v] = mp[v][u] = true;
	OK[0] = true;
	for (int S = 1; S < 1 << n; ++ S) {
		int low = 0;
		for (int i = 0; i < n; ++ i) if (S & 1 << i) {low = i; break;}
		OK[S] = OK[S & S - 1];
		for (int i = 0; i < n; ++ i) if ((S & 1 << i) && mp[i][low]) {OK[S] = false; break;}
		int mn = -1;
		for (int i = 0; i < n; ++ i) if (S & 1 << i) {
			to3[S] += pow3[i], ++ popcnt[S];
			if (mn == -1 || a[mn] > a[i]) mn = i;
		}
		Mn[S] = mn;
		if (popcnt[S] & 1) to3[S] += pow3[mn];
	}
	for (int S = 1; S < 1 << n; ++ S) {
		coef[S] = OK[S];
		int lowbit = S & -S;
		for (int S0 = S - 1 & S; S0; S0 = S0 - 1 & S)
			if (OK[S ^ S0] && (S0 & lowbit) == lowbit) mns(coef[S], coef[S0]);
	}
	dp[0] = 1;
	for (int S = 0; S < pow3[n]; ++ S) if (dp[S]) {
		int S0 = 0, fst = -1;
		for (int i = 0; i < n; ++ i) if (dig(S, i) == 0)
			if (fst == -1) fst = i; else S0 |= 1 << i;
		if (fst == -1) continue;
		for (int _ = S0; ; _ = _ - 1 & S0) {
			int S1 = _ | 1 << fst;
			if (coef[S1]) {
				int nxt = S + to3[S1];
				if (popcnt[S1] & 1) dp[nxt] = (dp[nxt] + 1ll * dp[S] * coef[S1]) % mod;
				else dp[nxt] = (dp[nxt] + 1ll * dp[S] * coef[S1] % mod * (a[Mn[S1]] + 1)) % mod;
			}
			if (!_) break;
		}
	}
	int base = 0, ans = 0;
	for (int i = 0; i < n; ++ i) base += pow3[i];
	for (int S = 1; S < 1 << n; ++ S) {
		int S0 = base;
		for (int i = 0; i < n; ++ i) if (S & 1 << i) S0 += pow3[i];
		ans = (ans + 1ll * dp[S0] * solve(S)) % mod;
	}
	ans = (ans + mod) % mod;
	printf("%d", ans);
	return 0;
}

详细

Subtask #1:

score: 20
Accepted

Test #1:

score: 20
Accepted
time: 0ms
memory: 1660kb

input:

4 6 2
7 11 14 0
1 2
1 3
2 3
2 4
4 1
4 3

output:

44

result:

ok 1 number(s): "44"

Test #2:

score: 0
Accepted
time: 0ms
memory: 1640kb

input:

4 4 6
12 14 14 5
4 2
1 4
3 2
1 2

output:

798

result:

ok 1 number(s): "798"

Test #3:

score: 0
Accepted
time: 0ms
memory: 3684kb

input:

3 3 2
10 4 11
2 1
3 2
1 3

output:

33

result:

ok 1 number(s): "33"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3688kb

input:

4 0 4
9 8 5 2

output:

148

result:

ok 1 number(s): "148"

Test #5:

score: 0
Accepted
time: 0ms
memory: 1660kb

input:

5 6 14
12 15 13 13 12
3 1
2 4
2 5
2 1
5 3
4 5

output:

21337

result:

ok 1 number(s): "21337"

Test #6:

score: 0
Accepted
time: 0ms
memory: 3704kb

input:

4 5 5
5 2 4 13
2 1
3 4
1 4
4 2
3 2

output:

42

result:

ok 1 number(s): "42"

Test #7:

score: 0
Accepted
time: 0ms
memory: 1504kb

input:

4 4 3
13 7 8 12
4 1
3 1
2 4
4 3

output:

552

result:

ok 1 number(s): "552"

Test #8:

score: 0
Accepted
time: 0ms
memory: 1640kb

input:

4 2 12
1 12 4 11
2 1
3 1

output:

70

result:

ok 1 number(s): "70"

Test #9:

score: 0
Accepted
time: 0ms
memory: 1648kb

input:

5 5 6
10 7 8 2 13
1 5
1 3
2 1
4 3
5 3

output:

1231

result:

ok 1 number(s): "1231"

Test #10:

score: 0
Accepted
time: 0ms
memory: 1624kb

input:

5 7 9
6 7 13 15 12
1 3
5 3
5 2
4 5
4 3
4 1
3 2

output:

6223

result:

ok 1 number(s): "6223"

Test #11:

score: 0
Accepted
time: 0ms
memory: 1652kb

input:

3 0 3
15 7 12

output:

104

result:

ok 1 number(s): "104"

Test #12:

score: 0
Accepted
time: 0ms
memory: 3536kb

input:

3 2 9
10 6 5
1 2
1 3

output:

17

result:

ok 1 number(s): "17"

Test #13:

score: 0
Accepted
time: 0ms
memory: 3696kb

input:

5 5 11
7 9 15 9 9
5 4
5 1
5 2
1 3
3 4

output:

5224

result:

ok 1 number(s): "5224"

Test #14:

score: 0
Accepted
time: 0ms
memory: 1492kb

input:

5 0 12
9 8 14 11 2

output:

3006

result:

ok 1 number(s): "3006"

Test #15:

score: 0
Accepted
time: 0ms
memory: 1612kb

input:

3 1 1
6 10 4
3 1

output:

30

result:

ok 1 number(s): "30"

Subtask #2:

score: 0
Wrong Answer

Dependency #1:

100%
Accepted

Test #16:

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

input:

9 27 705410105529944560
929827299070190972 733413770730537329 473007347105710981 190062421504120247 918561152768663129 196040702922254016 981530663192980241 203295856357272834 337150461958783092
2 8
7 9
8 9
2 3
9 2
2 7
9 5
9 4
4 8
1 7
6 3
6 1
4 1
6 5
2 4
2 1
9 3
9 6
7 3
7 5
5 2
4 5
2 6
3 1
3 8
4 3
8 6

output:

268798726

result:

wrong answer 1st numbers differ - expected: '5392583', found: '268798726'

Subtask #3:

score: 10
Accepted

Test #47:

score: 10
Accepted
time: 17ms
memory: 3616kb

input:

14 0 731833687287532167
157552918690640051 900457311668526045 111217720157614956 84140984111060473 814012186135880499 784848789620248379 958953377683017264 105083874298571687 104921429970878846 44983041675142735 871013110538758030 686733907990421995 98063590462078176 495161493555059993

output:

231790380

result:

ok 1 number(s): "231790380"

Test #48:

score: 0
Accepted
time: 1ms
memory: 1692kb

input:

11 0 101435837408688522
638776638580507479 933944392115323974 19098604312360490 142362319980029593 419910251764515410 275591812677260089 770239593400917018 928344484461634421 67340905784404712 378109786925249078 110881245457449811

output:

242383534

result:

ok 1 number(s): "242383534"

Test #49:

score: 0
Accepted
time: 0ms
memory: 1680kb

input:

9 0 100988561775675251
622570387572403506 684352103903274038 784649864569409753 270298495621205212 56183537059869110 346856482529145989 86639702870530669 607198038565138736 14747634008501988

output:

20893166

result:

ok 1 number(s): "20893166"

Test #50:

score: 0
Accepted
time: 0ms
memory: 1640kb

input:

10 0 839910859917247463
611237879350518457 292219463776059962 548211857317940894 822255554598388425 335628456629874391 774414280870858683 882480367082748768 654587410087321403 74330774886125511 22894883233341926

output:

61697734

result:

ok 1 number(s): "61697734"

Subtask #4:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

0%