记录编号 608010 评测结果 AAAAAAAAAA
题目名称 2511.学姐的巧克力盒 最终得分 100
用户昵称 Gravatar淮淮清子 是否通过 通过
代码语言 C++ 运行时间 8.894 s
提交时间 2025-10-22 15:02:58 内存使用 30.17 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;

#define ll long long
#define ls (p << 1)
#define rs (p << 1 | 1)
const int MAXN = 1e6 + 5;

int n, m, k, p1, p2, phi;
int a[MAXN];

struct Tree {
    int l, r;
    ll prod[2];
} t[MAXN << 2];

void read(int &x) {
    x = 0; int f = 1; char ch = getchar();
    while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + ch - '0'; ch = getchar(); }
    x *= f;
}

void pushup(int p) {
    if (p1) t[p].prod[0] = t[ls].prod[0] * t[rs].prod[0] % p1;
    if (p2) t[p].prod[1] = t[ls].prod[1] * t[rs].prod[1] % phi;
}

void build(int p, int l, int r) {
    t[p].l = l, t[p].r = r;
    if (l == r) {
        if (p1) t[p].prod[0] = a[l] % p1;
        if (p2) t[p].prod[1] = a[l] % phi;
        return;
    }
    int mid = (l + r) >> 1;
    build(ls, l, mid);
    build(rs, mid + 1, r);
    pushup(p);
}

ll query(int p, int L, int R, int o) {
    if (t[p].r < L || t[p].l > R) return 1;
    if (L <= t[p].l && t[p].r <= R) return t[p].prod[o];
    return query(ls, L, R, o) * query(rs, L, R, o) % (o == 0 ? p1 : phi);
}

int euler(int x) {
    int res = x;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            res = res / i * (i - 1);
            while (x % i == 0) x /= i;
        }
    }
    if (x > 1) res = res / x * (x - 1);
    return res;
}

ll qpow(ll a, ll b, ll mod) {
    ll res = 1;
    a %= mod;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

int main() {
    freopen("chocolatebox.in", "r", stdin);
    freopen("chocolatebox.out", "w", stdout);

    read(n), read(m), read(k), read(p1), read(p2);
    for (int i = 1; i <= n; i++) read(a[i]);

    if (p2) phi = euler(p2);

    build(1, 1, n);

    while (m--) {
        int op, l, r;
        read(op), read(l), read(r);
        if (op == 1 && p1) {
            cout << query(1, l, r, 0) << '\n';
        } else if (op == 2 && p2) {
            ll e = query(1, l, r, 1);
            cout << qpow(k, e, p2) << '\n';
        }
    }

    return 0;
}