如果你可以回应,我的一个问题:
TLE 90pts 求助。
#include <iostream>
#define int long long
using namespace std;
int pref[500005], phi[20000005]; bool flag;
void addd(int x, int v) {while (x <= 500000) {pref[x] += v; x += x & -x;}} int query(int x) {int summ=0; while (x) {summ += pref[x]; x -= x & -x;} return summ;}
__int128 qp(__int128 n, __int128 m, __int128 p) {if (!m) return 1; __int128 x = qp(n, m/2, p); flag |= x * x >= p || x * x % p * (m & 1 ? n : 1) >= p; return x * x % p * (m & 1 ? n : 1) % p;} // 这一层的模数就是下一层的 phi(p)
int seele(int l, int r, int p) {if (l > r || query(l) == 1 || p == 1) return !(flag = false); return qp(query(l), seele(l+1, r, phi[p]) + flag * phi[p], p);}
int read() {int x; cin >> x; return x;}
signed main() {
for (int i=1; i<=20000000; i++) phi[i] = i;
for (int i=2; i<=20000000; i++) if (phi[i] == i) for (int j=i; j<=20000000; j+=i) phi[j] = (phi[j] / i) * (i - 1);
int n, m, op, l, r, x; cin >> n >> m; for (int i=1; i<=n; i++) addd(i, read() - query(i-1)); while (m--) {cin >> op >> l >> r >> x; if (op == 1) addd(l, x), addd(r+1, -x); else cout << seele(l, r, x) % x << endl;}}