ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#184708 | #584. t3 | tkswls | 100 | 10476ms | 32788kb | C++11 | 4.6kb | 2023-09-12 09:34:06 | 2023-09-12 12:04:21 |
answer
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, a[100005], c[15], x[15][15], jie[15], inv[15], op;
const int mod = 1000000007;
inline int ksm(int p, int q) {
if (!q) return 1;
if (q == 1) return p;
if (q & 1) return p * ksm(p * p % mod, q / 2) % mod;
return ksm(p * p % mod, q / 2);
}
inline int C(int p, int q) {
return ((jie[p] * inv[q] % mod) * inv[p - q] % mod);
}
struct node {
int l, r, num[11], addtag, changetag;
} b[400005];
inline void update(int p) {
for (int i = 1; i <= 10; i++) {
b[p].num[i] = b[2 * p].num[i] + b[2 * p + 1].num[i];
}
}
inline void push_down(int p) {
if (b[p].l == b[p].r) return;
if (b[p].changetag != 1000000008) {
for (int i = 1; i <= 10; i++) {
b[2 * p].num[i] = b[2 * p].num[i - 1] * b[p].changetag % mod;
b[2 * p + 1].num[i] = b[2 * p + 1].num[i - 1] * b[p].changetag % mod;
}
b[2 * p].addtag = b[2 * p + 1].addtag = 0;
b[2 * p].changetag = b[2 * p + 1].changetag = b[p].changetag;
b[p].changetag = 1000000008;
}
if (b[p].addtag != 0) {
c[0] = 1;
c[1] = b[p].addtag;
for (int i = 2; i <= 10; i++) {
c[i] = c[i - 1] * b[p].addtag % mod;
}
for (int i = 10; i >= 1; i--) {
op = 0;
for (int j = i; j >= 0; j--) {
op = op + ((x[i][j] * b[2 * p].num[j] % mod) * c[i - j]) % mod;
op %= mod;
}
b[2 * p].num[i] = op;
}
for (int i = 10; i >= 1; i--) {
op = 0;
for (int j = i; j >= 0; j--) {
op = op + ((x[i][j] * b[2 * p + 1].num[j]) % mod * c[i - j]) % mod;
op %= mod;
}
b[2 * p + 1].num[i] = op;
}
b[2 * p].addtag += b[p].addtag;
b[2 * p + 1].addtag += b[p].addtag;
b[p].addtag = 0;
}
}
inline void build(int p, int l, int r) {
b[p].l = l;
b[p].r = r;
b[p].changetag = 1000000008;
b[p].addtag;
b[p].num[0] = r - l + 1;
if (l == r) {
b[p].num[1] = a[l];
for (int i = 2; i <= 10; i++) {
b[p].num[i] = b[p].num[i - 1] * a[l] % mod;
}
return;
}
build(2 * p, l, (l + r) >> 1);
build(2 * p + 1, ((l + r) >> 1) + 1, r);
update(p);
}
inline void add(int p, int l, int r, int w) {
// cout << p << " " << b[p].l << " " << b[p].r << ' ' << l << ' ' << r << ' ' << w << endl;
if (b[p].l >= l && b[p].r <= r) {
c[0] = 1;
c[1] = w;
for (int i = 2; i <= 10; i++) {
c[i] = c[i - 1] * w % mod;
}
for (int i = 10; i >= 1; i--) {
op = 0;
for (int j = i; j >= 0; j--) {
op = op + ((x[i][j] * b[p].num[j] % mod) * c[i - j]) % mod;
op %= mod;
}
b[p].num[i] = op;
}
b[p].addtag += w;
return;
}
push_down(p);
int mid = (b[p].l + b[p].r) >> 1;
if (r <= mid) add(2 * p, l, r, w);
else if (l > mid) add(2 * p + 1, l, r, w);
else {
add(2 * p, l, mid, w);
add(2 * p + 1, mid + 1, r, w);
}
update(p);
}
inline void change(int p, int l, int r, int w) {
// cout << p << ' ' << l << ' ' << r << "%%^" << b[p].l << ' ' << b[p].r << "-" << w << " " << b[p].num[0] << endl;
if (b[p].l >= l && b[p].r <= r) {
for (int i = 1; i <= 10; i++) {
b[p].num[i] = b[p].num[i - 1] * w % mod;
}
b[p].changetag = w;
b[p].addtag = 0;
// cout << b[p].num[0] << "*" << b[p].num[1] << "$" << b[p].num[2] << endl;
return;
}
push_down(p);
int mid = (b[p].l + b[p].r) >> 1;
if (r <= mid) change(2 * p, l, r, w);
else if (l > mid) change(2 * p + 1, l, r, w);
else {
change(2 * p, l, mid, w);
change(2 * p + 1, mid + 1, r, w);
}
update(p);
}
inline int query(int p, int l, int r, int w) {
// cout << l << "+" << r << "=" << w << " " << b[p].l << " " << b[p].r << ' ' << b[p].num[w] << endl;
if (b[p].l >= l && b[p].r <= r) {
return b[p].num[w];
}
push_down(p);
int mid = (b[p].l + b[p].r) >> 1;
if (r <= mid) return query(2 * p, l, r, w);
else if (l > mid) return query(2 * p + 1, l, r, w);
else {
return (query(2 * p, l, mid, w) + query(2 * p + 1, mid + 1, r, w)) % mod;
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
jie[0] = 1;
inv[0] = 1;
for (int i = 1; i <= 10; i++) {
jie[i] = jie[i - 1] * i;
inv[i] = ksm(jie[i], mod - 2);
}
for (int i = 1; i <= 10; i++) {
for (int j = 0; j <= i; j++) {
x[i][j] = C(i, j);
}
}
int op, p, q, w;
for (int i = 1; i <= m; i++) {
cin >> op >> p >> q >> w;
if (op == 1) {
add(1, p, q, w);
} else if (op == 2) {
change(1, p, q, w);
} else {
cout << query(1, p, q, w) << "\n";
}
}
}
//5 9
//1 1 2 4 6
//3 1 3 1
//2 1 3 1
//3 1 3 2
//2 1 2 3
//3 1 2 2
//2 3 5 1
//3 3 5 3
//2 5 5 3
//3 1 2 2
详细
小提示:点击横条可展开更详细的信息
Test #1:
score: 10
Accepted
time: 5ms
memory: 1408kb
input:
458 823 14431 9895 11970 15308 2575 20181 709 27999 12992 18884 11061 16281 5044 28990 25092 28337 3...
output:
806084096 117884357 581509507 903754571 381316325 789203673 312340523 659242359 741787988 89040104 4...
result:
ok 261 lines
Test #2:
score: 10
Accepted
time: 3ms
memory: 1408kb
input:
481 526 8409 14498 18636 10027 24362 32458 17986 17730 11956 19192 2193 1034 29317 19284 16210 26242...
output:
867105097 717265913 288311190 320452351 133 498037408 473281413 216488030 182572597 611630662 471106...
result:
ok 179 lines
Test #3:
score: 10
Accepted
time: 1368ms
memory: 32788kb
input:
100000 100000 15247 4194 9619 4532 22058 2667 21549 16652 25327 12018 13395 11426 7243 11714 22904 2...
output:
54433 544457741 352487648 82525935 532381851 235929450 38218 30045720 19138 459644406 33559 30953524...
result:
ok 33327 lines
Test #4:
score: 10
Accepted
time: 1682ms
memory: 32784kb
input:
100000 100000 6264 26207 28424 24165 4852 20798 5803 18679 24588 12238 25786 28622 19900 101 25922 2...
output:
18923 13111195 41716 34447 32091 80654 731180277 9973 523560023 19797 159789457 695071461 3136 95363...
result:
ok 33328 lines
Test #5:
score: 10
Accepted
time: 1745ms
memory: 32788kb
input:
100000 100000 15043 9299 7163 25384 24996 3803 24356 12466 22073 12987 8931 14997 3951 32704 23076 8...
output:
754347097 6296 588341566 325967942 180064833 683 831351544 63953 57030 17635 175222109 5280 57193 32...
result:
ok 33349 lines
Test #6:
score: 10
Accepted
time: 1487ms
memory: 32784kb
input:
100000 100000 14736 16956 19864 23894 29403 5507 12182 6188 17192 14440 18618 3970 15396 15037 23334...
output:
17008 73008 935797904 16519312 15383 25232 236856418 75334 25854 46510 797344028 517157465 595936107...
result:
ok 33304 lines
Test #7:
score: 10
Accepted
time: 623ms
memory: 17040kb
input:
50000 50000 17799 29763 25337 21321 1391 31852 27418 28753 18524 14044 15976 18893 12274 22834 11348...
output:
19498 473297203 695948777 299749756 50630760 692747746 369627246 181903142 328502296 939823794 69850...
result:
ok 16802 lines
Test #8:
score: 10
Accepted
time: 643ms
memory: 17044kb
input:
50000 50000 10654 14956 14287 25326 8102 30579 11682 23553 272 22672 14460 30241 13026 12738 4912 72...
output:
717018991 140916081 273712387 602991268 878512570 665908548 10388 4939 283493752 435656498 657720400...
result:
ok 16814 lines
Test #9:
score: 10
Accepted
time: 1453ms
memory: 32712kb
input:
90000 90000 29538 28214 24706 30393 27759 9002 13458 10243 15713 14881 10630 5593 7942 24578 29370 1...
output:
738835738 738703020 3888 402391875 37270 872563699 273399892 807398793 365897262 255303782 93280847 ...
result:
ok 29904 lines
Test #10:
score: 10
Accepted
time: 1467ms
memory: 32788kb
input:
100000 100000 23515 49 31372 25112 16779 21279 30735 32743 14678 15189 1763 23114 32215 14873 20487 ...
output:
576735050 562509678 553431297 662173102 515338212 478400370 879269281 500659410 483381164 1679282 16...
result:
ok 33309 lines