UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#197450#3449. 依存症FAT1008598ms346232kbC++112.3kb2023-11-12 10:12:322023-11-12 13:16:44

answer

#include <bits/stdc++.h>
#define hb(x) (31 - __builtin_clz(x))
using namespace std;
const int mod = 1000000007, inv2 = 500000004;
inline int Mod(int x) { return x + ((x >> 31) & mod); }
inline int add(int x, int y) { return Mod(x + y - mod); }
inline int sub(int x, int y) { return Mod(x - y); }
inline int mul(int x, int y) { return 1ll * x * y % mod; }
const int maxn = 1 << 20;
char str[maxn + 5];
int pw2[maxn + 5], pw2i[maxn + 5];
int s0[maxn + 5];
int s1[2][25][maxn + 5], s2[2][25][maxn + 5];
void solve(int tp, int l, int r, int d) {
	if (l == r) return;
	int mid = (l + r) / 2;
	int *S1 = s1[tp][d], *S2 = s2[tp][d];
	S1[mid] = S2[mid] = 0;
	int sum = 0;
	if (str[mid] == '0' + tp) S1[mid] = pw2[mid], sum = pw2i[mid];
	for (int i = mid - 1; i >= l; i--) {
		S1[i] = S1[i + 1], S2[i] = S2[i + 1];
		if (str[i] == '0' + tp) {
			S1[i] = add(S1[i], pw2[i]);
			S2[i] = add(S2[i], mul(pw2[i], sum));
			sum = add(sum, pw2i[i]); 
		}
	}
	S1[mid + 1] = S2[mid + 1] = 0;
	sum = 0;
	if (str[mid + 1] == '0' + tp) S1[mid + 1] = pw2i[mid + 1], sum = pw2[mid + 1];
	for (int i = mid + 2; i <= r; i++) {
		S1[i] = S1[i - 1], S2[i] = S2[i - 1];
		if (str[i] == '0' + tp) {
			S1[i] = add(S1[i], pw2i[i]);
			S2[i] = add(S2[i], mul(pw2i[i], sum));
			sum = add(sum, pw2[i]);
		}
	}
	solve(tp, l, mid, d - 1), solve(tp, mid + 1, r, d - 1);
}
inline int query(int l, int r) {
	int d = hb((l - 1) ^ (r - 1));
	return add(add(add(s2[0][d][l], s2[0][d][r]), mul(s1[0][d][l], s1[0][d][r])), add(add(s2[1][d][l], s2[1][d][r]), mul(s1[1][d][l], s1[1][d][r])));
}
int main() {
	int n, q, sd;
	scanf("%d%d%d%s", &n, &q, &sd, str + 1);
	mt19937 rng(sd);
	pw2[0] = pw2i[0] = 1;
	for (int i = 1; i <= n; i++) pw2[i] = mul(pw2[i - 1], 2), pw2i[i] = mul(pw2i[i - 1], inv2);
	for (int i = 2; i <= n; i++) {
		s0[i] = s0[i - 1];
		if (str[i] == str[i - 1]) s0[i]++;
	}
	int l = 1, c = 0;
	while (l < n) l <<= 1, c++;
	solve(0, 1, l, c - 1), solve(1, 1, l, c - 1);
	long long ans = 0;
	for (int i = 1; i <= q; i++) {
		int l = rng() % n + 1, r = rng() % n + 1;
		if (l > r) swap(l, r);
		if (l == r) continue;
		int len = r - l + 1;
		int nw = sub(pw2[len - 1], len);
		nw = add(nw, s0[r] - s0[l]);
		nw = add(nw, mul(query(l, r), pw2[len - 1]));
		nw = mul(nw, inv2);
		ans ^= 1LL * i * nw;
	}
	printf("%lld", ans);
} 

详细

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

Test #1:

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

input:

10 10 225061887
1010000111

output:

2551

result:

ok 1 number(s): "2551"

Test #2:

score: 10
Accepted
time: 522ms
memory: 38064kb

input:

10 10000000 377962726
1110100001

output:

5319329936

result:

ok 1 number(s): "5319329936"

Test #3:

score: 10
Accepted
time: 527ms
memory: 38068kb

input:

10 10000000 294721958
0010000100

output:

14310656348

result:

ok 1 number(s): "14310656348"

Test #4:

score: 10
Accepted
time: 343ms
memory: 346232kb

input:

1000000 10 413694761
1110100011101010111100011000101110001110100001010010111011000101001011111000001...

output:

7814245032

result:

ok 1 number(s): "7814245032"

Test #5:

score: 10
Accepted
time: 342ms
memory: 346232kb

input:

1000000 10 94552888
00111101110001000000101011100001000111111101000001000111101111000110001010000101...

output:

3959639370

result:

ok 1 number(s): "3959639370"

Test #6:

score: 10
Accepted
time: 52ms
memory: 83888kb

input:

100000 100000 790695006
0101000110101000011110010101100101100000000100000001010111000000100111011011...

output:

22944277449057

result:

ok 1 number(s): "22944277449057"

Test #7:

score: 10
Accepted
time: 45ms
memory: 83892kb

input:

100000 100000 719329098
1110101100001111101010001111000000110100010001011000010001111100110010101011...

output:

80140921752825

result:

ok 1 number(s): "80140921752825"

Test #8:

score: 10
Accepted
time: 2216ms
memory: 346228kb

input:

1000000 10000000 550285156
0000000000000000000000000000000000000000000000000000000000000000000000000...

output:

112491807887012

result:

ok 1 number(s): "112491807887012"

Test #9:

score: 10
Accepted
time: 2275ms
memory: 346232kb

input:

1000000 10000000 94478736
11111001010000100001101011110100011101000100100101110001100110100101001111...

output:

15769271525357998

result:

ok 1 number(s): "15769271525357998"

Test #10:

score: 10
Accepted
time: 2276ms
memory: 346228kb

input:

1000000 10000000 561588670
1101000101110011011101000110010101101010110110100100010001010010011000101...

output:

2131628890817536

result:

ok 1 number(s): "2131628890817536"

Extra Test:

score: 0
Extra Test Passed