Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6f337f9

Browse files
Update 3655.XOR-After-Range-Multiplication-Queries-II.cpp
1 parent ccf8920 commit 6f337f9

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed
Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using ll = long long;
2+
ll M = 1e9+7;
3+
ll MOD = 1e9+7;
24
class Solution {
3-
int MOD = 1e9+7;
45
public:
56
long long quickPow(long long x, long long N)
67
{
@@ -15,48 +16,54 @@ class Solution {
1516
{
1617
return quickPow(x, MOD - 2);
1718
}
18-
19+
1920
int xorAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
2021
int n = nums.size();
21-
constint B = 400;
22+
vector<ll>m(n, 1);
2223

23-
vector<ll>multipliers(n,1);
24+
int B = 320;
2425

2526
vector<vector<int>>small_k_queries[B+1];
2627

2728
for (auto q: queries) {
2829
int l = q[0], r = q[1], k = q[2], v = q[3];
2930
if (k>B) {
30-
for (int i=l; i<=r; i+=k)
31-
multipliers[i] = (multipliers[i]*v) % MOD;
31+
for (int i=l; i<=r; i+=k) {
32+
m[i] = m[i] * v % M;
33+
}
3234
} else {
3335
small_k_queries[k].push_back(q);
3436
}
3537
}
3638

3739
for (int k=1; k<=B; k++) {
38-
if (small_k_queries[k].empty())
39-
continue;
40-
vector<ll>diff(n+1,1);
41-
for (auto& q: small_k_queries[k]) {
42-
int l = q[0], r = q[1], v = q[3];
43-
r = (r-l)/k*k+l;
44-
diff[l] = (diff[l]*v)%MOD;
45-
if (r+k<n+1) diff[r+k] = diff[r+k] * inv(v) % MOD;
40+
if (small_k_queries[k].empty()) continue;
41+
vector<ll>diff(n+1, 1);
42+
for (auto&q: small_k_queries[k]) {
43+
int l = q[0], r = q[1], k = q[2], v = q[3];
44+
r = (r-l)/k*k + l;
45+
diff[l] = diff[l] * v % M;
46+
if (r+k<=n) diff[r+k] = diff[r+k] * inv(v) % M;
47+
}
48+
49+
vector<ll>this_round_m(n+1, 1);
50+
for (int i=0; i<n; i++) {
51+
this_round_m[i] = (i>=k?this_round_m[i-k]:1) * diff[i] % M;
4652
}
4753

4854
for (int i=0; i<n; i++) {
49-
if (i>=k)
50-
diff[i] = diff[i]*diff[i-k] % MOD;
51-
m[i] = m[i] * diff[i] % MOD;
55+
m[i] = m[i] * this_round_m[i] % MOD;
5256
}
57+
5358
}
5459

5560
int ret = 0;
56-
for(int i=0; i<n; i++) {
57-
ll val = (ll)nums[i]*multipliers[i]%MOD;
61+
for(int i=0; i<n; i++) {
62+
ll val = (ll)nums[i] * m[i] % M;
5863
ret ^= (int)val;
5964
}
65+
6066
return ret;
6167
}
6268
};
69+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /