1
1
using ll = long long ;
2
+ ll M = 1e9 +7 ;
3
+ ll MOD = 1e9 +7 ;
2
4
class Solution {
3
- int MOD = 1e9 +7 ;
4
5
public:
5
6
long long quickPow (long long x, long long N)
6
7
{
@@ -15,48 +16,54 @@ class Solution {
15
16
{
16
17
return quickPow (x, MOD - 2 );
17
18
}
18
-
19
+
19
20
int xorAfterQueries (vector<int >& nums, vector<vector<int >>& queries) {
20
21
int n = nums.size ();
21
- const int B = 400 ;
22
+ vector<ll> m (n, 1 ) ;
22
23
23
- vector<ll> multipliers (n, 1 ) ;
24
+ int B = 320 ;
24
25
25
26
vector<vector<int >>small_k_queries[B+1 ];
26
27
27
28
for (auto q: queries) {
28
29
int l = q[0 ], r = q[1 ], k = q[2 ], v = q[3 ];
29
30
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
+ }
32
34
} else {
33
35
small_k_queries[k].push_back (q);
34
36
}
35
37
}
36
38
37
39
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;
46
52
}
47
53
48
54
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;
52
56
}
57
+
53
58
}
54
59
55
60
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 ;
58
63
ret ^= (int )val;
59
64
}
65
+
60
66
return ret;
61
67
}
62
68
};
69
+
0 commit comments