#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define db long double
#define pb push_back
#define ppb pop_back
#define F first
#define S second
#define mp make_pair
#define all(x) (x).begin(), (x).end()
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
const int N = 1003, M = 100003, K = 128, MOD = 1e9 + 7;
int n, q, a[N], pw[M];
vector <pii> L[N], R[N];
int bit[K], mask[K];
struct basis {
short int b[7];
int sz = 0, bsz = 0;
bitset <K> can;
basis() {
memset(& b, 0, sizeof(b));
can[0] = 1;
}
void clear() {
memset(& b, 0, sizeof(b));
sz = 0;
bsz = 0;
can.reset();
can[0] = 1;
};
void upd() {
can.reset();
for (int i = 0; i < (1 << bsz); i++) {
if (i > 0) {
mask[i] = mask[i ^ (1 << bit[i])] ^ b[bit[i]];
}
can[mask[i]] = 1;
}
};
bool add(int x) {
sz++;
if (can[x]) {
return false;
}
for (int i = 0; i < bsz; i++) {
x = min(x, x ^ b[i]);
}
b[bsz++] = x;
upd();
return true;
}
int ways() {
return pw[sz - bsz];
}
};
basis cur, C[N][N], A[N][10];
short int f[K][N][10], g[K];
int last[N][N];
int main() {
ios_base::sync_with_stdio(false), cin.tie(NULL);
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
pw[0] = 1;
for (int i = 1; i < M; i++) {
pw[i] = pw[i - 1] * 2 % MOD;
}
for (int i = 1; i < K; i++) {
for (int j = 6; j >= 0; j--) {
if (i >> j & 1) {
bit[i] = j;
break;
}
}
}
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
cin >> q;
for (int i = 1; i <= q; i++) {
int l, r, x;
cin >> l >> r >> x;
R[r].pb({l, x});
L[l].pb({r, x});
}
for (int l = 1; l <= n; l++) {
cur.clear();
for (int r = n; r >= l; r--) {
for (auto i : R[r]) {
if (i.F <= l) {
cur.add(i.S);
}
}
C[l][r] = cur;
}
}
memset(& last, -1, sizeof(last));
for (int l = 1; l <= n; l++) {
cur.clear();
int cnt = 0;
last[l][l] = cnt;
for (int r = l; r <= n; r++) {
int pos = last[l][r];
if (pos == cnt) {
A[l][pos] = cur;
for (int i = 0; i < K; i++) {
for (int j = 0; j < K; j++) {
f[i][l][pos] += j * cur.can[j ^ i];
}
}
cnt++;
} else {
last[l][r] = last[l][r - 1];
}
for (auto i : R[r]) {
if (i.F <= l && cur.add(i.S)) {
last[l][r + 1] = cnt;
}
}
}
}
int ans = 0;
for (int r = n; r >= 1; r--) {
cur.clear();
for (int i = 0; i < K; i++) {
g[i] = 0;
for (int j = 0; j < K; j++) {
g[i] += j * cur.can[j ^ i];
}
}
for (int l = r; l >= 1; l--) {
int res = 0, pos = last[l][r];
assert(pos != -1);
for (int i = 0; i < K; i++) {
res += (int)C[l][r].can[i] * f[i ^ a[l]][l][pos] * g[i ^ a[r]];
if (res >= MOD) {
res -= MOD;
}
}
res = (ll)res * C[l][r].ways() % MOD;
res = (ll)res * A[l][pos].ways() % MOD;
res = (ll)res * cur.ways() % MOD;
res = (ll)res * pw[q - C[l][r].sz - A[l][pos].sz - cur.sz] % MOD;
if (l == r) {
res = (ll)res * ((MOD + 1) / 2) % MOD;
}
int occ = l * (n - r + 1);
ans += (ll)res * occ % MOD;
if (ans >= MOD) {
ans -= MOD;
}
for (auto i : L[l]) {
if (i.F >= r && cur.add(i.S)) {
for (int k = 0; k < K; k++) {
g[k] = 0;
for (int j = 0; j < K; j++) {
g[k] += j * cur.can[j ^ k];
}
}
}
}
}
}
cout << 2 * ans % MOD;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
29 ms |
44928 KB |
Output is correct |
2 |
Correct |
29 ms |
45056 KB |
Output is correct |
3 |
Correct |
29 ms |
45048 KB |
Output is correct |
4 |
Correct |
30 ms |
45008 KB |
Output is correct |
5 |
Correct |
28 ms |
45056 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
29 ms |
44928 KB |
Output is correct |
2 |
Correct |
29 ms |
45056 KB |
Output is correct |
3 |
Correct |
29 ms |
45048 KB |
Output is correct |
4 |
Correct |
30 ms |
45008 KB |
Output is correct |
5 |
Correct |
28 ms |
45056 KB |
Output is correct |
6 |
Correct |
50 ms |
45176 KB |
Output is correct |
7 |
Correct |
35 ms |
45184 KB |
Output is correct |
8 |
Correct |
42 ms |
45176 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
88 ms |
47352 KB |
Output is correct |
2 |
Correct |
56 ms |
45492 KB |
Output is correct |
3 |
Correct |
49 ms |
45304 KB |
Output is correct |
4 |
Correct |
42 ms |
45304 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
429 ms |
47072 KB |
Output is correct |
2 |
Correct |
415 ms |
47068 KB |
Output is correct |
3 |
Correct |
415 ms |
47052 KB |
Output is correct |
4 |
Correct |
399 ms |
46968 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
36 ms |
45056 KB |
Output is correct |
2 |
Correct |
35 ms |
45048 KB |
Output is correct |
3 |
Correct |
36 ms |
45056 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
36 ms |
45056 KB |
Output is correct |
2 |
Correct |
35 ms |
45048 KB |
Output is correct |
3 |
Correct |
36 ms |
45056 KB |
Output is correct |
4 |
Correct |
36 ms |
45184 KB |
Output is correct |
5 |
Correct |
36 ms |
45184 KB |
Output is correct |
6 |
Correct |
37 ms |
45184 KB |
Output is correct |
7 |
Correct |
37 ms |
45184 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
29 ms |
44928 KB |
Output is correct |
2 |
Correct |
29 ms |
45056 KB |
Output is correct |
3 |
Correct |
29 ms |
45048 KB |
Output is correct |
4 |
Correct |
30 ms |
45008 KB |
Output is correct |
5 |
Correct |
28 ms |
45056 KB |
Output is correct |
6 |
Correct |
50 ms |
45176 KB |
Output is correct |
7 |
Correct |
35 ms |
45184 KB |
Output is correct |
8 |
Correct |
42 ms |
45176 KB |
Output is correct |
9 |
Correct |
36 ms |
45056 KB |
Output is correct |
10 |
Correct |
35 ms |
45048 KB |
Output is correct |
11 |
Correct |
36 ms |
45056 KB |
Output is correct |
12 |
Correct |
76 ms |
45308 KB |
Output is correct |
13 |
Correct |
66 ms |
45304 KB |
Output is correct |
14 |
Correct |
54 ms |
45312 KB |
Output is correct |
15 |
Correct |
71 ms |
45216 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
29 ms |
44928 KB |
Output is correct |
2 |
Correct |
29 ms |
45056 KB |
Output is correct |
3 |
Correct |
29 ms |
45048 KB |
Output is correct |
4 |
Correct |
30 ms |
45008 KB |
Output is correct |
5 |
Correct |
28 ms |
45056 KB |
Output is correct |
6 |
Correct |
50 ms |
45176 KB |
Output is correct |
7 |
Correct |
35 ms |
45184 KB |
Output is correct |
8 |
Correct |
42 ms |
45176 KB |
Output is correct |
9 |
Correct |
36 ms |
45056 KB |
Output is correct |
10 |
Correct |
35 ms |
45048 KB |
Output is correct |
11 |
Correct |
36 ms |
45056 KB |
Output is correct |
12 |
Correct |
36 ms |
45184 KB |
Output is correct |
13 |
Correct |
36 ms |
45184 KB |
Output is correct |
14 |
Correct |
37 ms |
45184 KB |
Output is correct |
15 |
Correct |
37 ms |
45184 KB |
Output is correct |
16 |
Correct |
76 ms |
45308 KB |
Output is correct |
17 |
Correct |
66 ms |
45304 KB |
Output is correct |
18 |
Correct |
54 ms |
45312 KB |
Output is correct |
19 |
Correct |
71 ms |
45216 KB |
Output is correct |
20 |
Correct |
649 ms |
48888 KB |
Output is correct |
21 |
Correct |
329 ms |
48376 KB |
Output is correct |
22 |
Correct |
703 ms |
48760 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
29 ms |
44928 KB |
Output is correct |
2 |
Correct |
29 ms |
45056 KB |
Output is correct |
3 |
Correct |
29 ms |
45048 KB |
Output is correct |
4 |
Correct |
30 ms |
45008 KB |
Output is correct |
5 |
Correct |
28 ms |
45056 KB |
Output is correct |
6 |
Correct |
50 ms |
45176 KB |
Output is correct |
7 |
Correct |
35 ms |
45184 KB |
Output is correct |
8 |
Correct |
42 ms |
45176 KB |
Output is correct |
9 |
Correct |
88 ms |
47352 KB |
Output is correct |
10 |
Correct |
56 ms |
45492 KB |
Output is correct |
11 |
Correct |
49 ms |
45304 KB |
Output is correct |
12 |
Correct |
42 ms |
45304 KB |
Output is correct |
13 |
Correct |
429 ms |
47072 KB |
Output is correct |
14 |
Correct |
415 ms |
47068 KB |
Output is correct |
15 |
Correct |
415 ms |
47052 KB |
Output is correct |
16 |
Correct |
399 ms |
46968 KB |
Output is correct |
17 |
Correct |
36 ms |
45056 KB |
Output is correct |
18 |
Correct |
35 ms |
45048 KB |
Output is correct |
19 |
Correct |
36 ms |
45056 KB |
Output is correct |
20 |
Correct |
36 ms |
45184 KB |
Output is correct |
21 |
Correct |
36 ms |
45184 KB |
Output is correct |
22 |
Correct |
37 ms |
45184 KB |
Output is correct |
23 |
Correct |
37 ms |
45184 KB |
Output is correct |
24 |
Correct |
76 ms |
45308 KB |
Output is correct |
25 |
Correct |
66 ms |
45304 KB |
Output is correct |
26 |
Correct |
54 ms |
45312 KB |
Output is correct |
27 |
Correct |
71 ms |
45216 KB |
Output is correct |
28 |
Correct |
649 ms |
48888 KB |
Output is correct |
29 |
Correct |
329 ms |
48376 KB |
Output is correct |
30 |
Correct |
703 ms |
48760 KB |
Output is correct |
31 |
Correct |
1394 ms |
50724 KB |
Output is correct |
32 |
Correct |
751 ms |
50168 KB |
Output is correct |
33 |
Correct |
1535 ms |
50680 KB |
Output is correct |
34 |
Correct |
1231 ms |
49964 KB |
Output is correct |
35 |
Correct |
1245 ms |
49860 KB |
Output is correct |
36 |
Correct |
1233 ms |
49900 KB |
Output is correct |