UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#203541#3566. T1Anonyme100146ms1644kbC++111.4kb2024-02-27 10:05:052024-02-27 13:03:11

answer

#include <bits/stdc++.h>
using namespace std;

#define QwQ330AwA return 0
#define ll long long

const int mod = 998244353;
int n;
int a[100005];
int f[2][2], g[2][2];

int ksm(int a, int b) {
	a %= mod;
	int ans = 1;
	for (; b; b >>= 1, a = 1ll * a * a % mod) {
		if (b & 1) ans = 1ll * ans * a % mod;
	}
	return ans;
}

void add(int &x, int y) {
	x += y;
	if (x >= mod) x -= mod;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	int sum = 0;
	for (int i = 1; i <= n; i++) cin >> a[i], sum ^= a[i];
	int ans = 0;
	for (int p = 29; p >= 0; p--) {
		memset(f, 0, sizeof(f));
		f[0][0] = 1;
		int fl = 0;
		for (int i = 1; i <= n; i++) {
			memset(g, 0, sizeof(g));
			if (a[i] & (1 << p)) {
				fl ^= 1;
				a[i] -= (1 << p);
				for (int j = 0; j < 2; j++) {
					for (int k = 0; k < 2; k++) {
						add(g[j ^ 1][k], 1ll * (a[i] + 1) % mod * f[j][k] % mod);
						add(g[j][k | 1], 1ll * (1 << p) % mod * f[j][k] % mod);
					}
				}
			} else {
				for (int j = 0; j < 2; j++) {
					for (int k = 0; k < 2; k++) {
						add(g[j][k], 1ll * (a[i] + 1) % mod * f[j][k] % mod);
					}
				}				
			}
			swap(f, g);
		}
		//cout << 1ll * f[0][1] * ksm(1 << p, mod - 2) % mod << endl;
		add(ans, 1ll * f[0][1] * ksm(1 << p, mod - 2) % mod);
		if (fl) break;
	}
	if (!sum) add(ans, 1);
	cout << ans;
	QwQ330AwA;
}

详细

小提示:点击横条可展开更详细的信息

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 0ms
memory: 1252kb

input:

10
3 5 0 1 0 3 5 4 2 5

output:

13248

result:

ok 1 number(s): "13248"

Subtask #2:

score: 10
Accepted

Test #2:

score: 10
Accepted
time: 42ms
memory: 1640kb

input:

100000
25 0 7 1 42 27 29 17 26 23 11 4 24 40 31 10 6 16 26 26 46 27 7 32 9 33 17 15 4 44 36 29 19 17...

output:

460821675

result:

ok 1 number(s): "460821675"

Subtask #3:

score: 10
Accepted

Test #3:

score: 10
Accepted
time: 38ms
memory: 1644kb

input:

100000
14 25 9 27 9 33 48 28 10 29 28 39 50 33 8 18 38 0 34 25 13 7 30 48 13 39 14 11 40 8 32 3 7 16...

output:

885189946

result:

ok 1 number(s): "885189946"

Subtask #4:

score: 10
Accepted

Test #4:

score: 10
Accepted
time: 9ms
memory: 1640kb

input:

100000
999998102 402961903 309346107 445160702 274308544 145846539 341002420 77841978 313436667 3206...

output:

714756233

result:

ok 1 number(s): "714756233"

Subtask #5:

score: 10
Accepted

Test #5:

score: 10
Accepted
time: 13ms
memory: 1640kb

input:

100000
999998479 400795186 127605328 439009686 279338791 222344190 32214702 347490239 390113609 1737...

output:

885251777

result:

ok 1 number(s): "885251777"

Subtask #6:

score: 10
Accepted

Test #6:

score: 10
Accepted
time: 8ms
memory: 1644kb

input:

100000
999980995 341927799 474797020 355936070 215296904 77682610 413850993 194378088 233473841 3566...

output:

99729538

result:

ok 1 number(s): "99729538"

Subtask #7:

score: 10
Accepted

Test #7:

score: 10
Accepted
time: 0ms
memory: 1264kb

input:

2000
540706819 309629779 17707890 194083691 334726587 456162964 498417390 246765617 957682339 604730...

output:

800177499

result:

ok 1 number(s): "800177499"

Subtask #8:

score: 10
Accepted

Test #8:

score: 10
Accepted
time: 0ms
memory: 1264kb

input:

2000
101722906 988313572 550840902 777765553 778991206 95817204 989809443 357040014 425595004 794587...

output:

443206431

result:

ok 1 number(s): "443206431"

Subtask #9:

score: 10
Accepted

Test #9:

score: 10
Accepted
time: 18ms
memory: 1640kb

input:

100000
327468559 836395032 98737045 14714567 147268924 355455125 829199457 117664948 79547712 117935...

output:

252529800

result:

ok 1 number(s): "252529800"

Subtask #10:

score: 10
Accepted

Test #10:

score: 10
Accepted
time: 18ms
memory: 1644kb

input:

100000
334373908 573410989 584461609 757523993 595819683 93095595 866600961 552146722 657326632 1804...

output:

633437866

result:

ok 1 number(s): "633437866"