General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
229665090 Practice:
ZhengYuXiang
1109E - 60 C++14 (GCC 6-32) Accepted 639 ms 27408 KB 2023-10-25 12:01:49 2023-10-25 12:01:49
→ Source
// LUOGU_RID: 131528874
#include <bits/stdc++.h>
#define ll long long
#define lson u << 1
#define rson u << 1 | 1
#define mid (L[u] + R[u] >> 1)
using namespace std;

const int N = 1e5 + 10;
int L[N << 2], R[N << 2], sum[N << 2], val[N << 2], mul[N << 2], c[N << 2][12];
int k, p[N], phi, tmp;
int n, mod, a[N];
int m, op, x, y, z;

inline int pwr(int b, int k) {
	int res = 1;
	while (k) {
		if (k & 1) res = (ll)res * b % mod;
		b = (ll)b * b % mod; k >>= 1;
	}
	return res;
}

inline void pushup(int u) {
	sum[u] = (sum[lson] + sum[rson]) % mod;
}

inline void apply(int u, int v) {
	sum[u] = (ll)sum[u] * v % mod;
	mul[u] = (ll)mul[u] * v % mod;
}

inline void pushdown(int u) {
	apply(lson, mul[u]);
	apply(rson, mul[u]);
	val[lson] = (ll)val[lson] * val[u] % mod;
	val[rson] = (ll)val[rson] * val[u] % mod;
	mul[u] = val[u] = 1;
	for (int i = 1; i <= k; i++) {
		c[lson][i] += c[u][i];
		c[rson][i] += c[u][i];
		c[u][i] = 0;
	}
}

inline void build(int u, int l, int r) {
	L[u] = l, R[u] = r;
	mul[u] = val[u] = 1;
	if (l == r) {
		sum[u] = a[l] % mod;
		for (int i = 1; i <= k; i++) while (a[l] % p[i] == 0) c[u][i]++, a[l] /= p[i];
		val[u] = a[l] % mod;
		return;
	}
	build(lson, l, mid);
	build(rson, mid + 1, r);
	pushup(u);
}

inline void modify(int u, int l, int r, int x) {
	if (l <= L[u] && R[u] <= r) {
		apply(u, x);
		for (int i = 1; i <= k; i++) while (x % p[i] == 0) c[u][i]++, x /= p[i];
		val[u] = (ll)val[u] * x % mod;
		return;
	}
	pushdown(u);
	if (l <= mid) modify(lson, l, r, x);
	if (r > mid) modify(rson, l, r, x);
	pushup(u);
}

inline void divide(int u, int x, int v) {
	if (L[u] == R[u]) {
		for (int i = 1; i <= k; i++) while (v % p[i] == 0) c[u][i]--, v /= p[i];
		val[u] = (ll)val[u] * pwr(v, phi - 1) % mod;
		sum[u] = val[u];
		for (int i = 1; i <= k; i++) sum[u] = (ll)sum[u] * pwr(p[i], c[u][i]) % mod;
		return;
	}
	pushdown(u);
	if (x <= mid) divide(lson, x, v);
	else divide(rson, x, v);
	pushup(u);
}

inline int query(int u, int l, int r) {
	if (l <= L[u] && R[u] <= r) return sum[u];
	pushdown(u);
	int res = 0;
	if (l <= mid) res = (res + query(lson, l, r)) % mod;
	if (r > mid) res = (res + query(rson, l, r)) % mod;
	return res;
}

inline void init() {
	phi = tmp = mod;
	for (int i = 2; i * i <= tmp; i++) {
		if (tmp % i) continue;
		p[++k] = i;
		phi = phi / i * (i - 1);
		while (tmp % i == 0) tmp /= i;
	}
	if (tmp > 1) p[++k] = tmp, phi = phi / tmp * (tmp - 1);
}

int main() {
	scanf("%d%d", &n, &mod);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
	init();
	build(1, 1, n);
	scanf("%d", &m);
	while (m--) {
		scanf("%d%d%d", &op, &x, &y);
		if (op == 1) scanf("%d", &z), modify(1, x, y, z);
		if (op == 2) divide(1, x, y);
		if (op == 3) printf("%d\n", query(1, x, y));
	}
	return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details