ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#197450 | #3449. 依存症 | FAT | 100 | 8598ms | 346232kb | C++11 | 2.3kb | 2023-11-12 10:12:32 | 2023-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);
}
Details
小提示:点击横条可展开更详细的信息
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