UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#184708#584. t3tkswls10010476ms32788kbC++114.6kb2023-09-12 09:34:062023-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