比赛 20251022赛前模拟1 评测结果 WWWWWWAAAA
题目名称 学姐的巧克力盒 最终得分 40
用户昵称 淮淮清子 运行时间 4.245 s
代码语言 C++ 内存使用 7.87 MiB
提交时间 2025-10-22 11:35:08
显示代码纯文本
#include<iostream>
using namespace std;

#define ll long long
const int MAXN = 1e6 + 5;

int n, m, k, p1, p2, phi;
int a[MAXN], pre1[MAXN], pre2[MAXN];
bool o[MAXN];

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

int exgcd(int a, int b, int &x, int &y){
    if(!b){x = 1; y = 0; return a;}
    int g = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return g;
}

int inv(int x, int mod){
    int x0, y0;
    int g = exgcd(x, mod, x0, y0);
    if(g != 1) return 0;
    return (x0 % mod + mod) % mod;
}

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;
}

int main(){
	freopen("chocolatebox.in", "r", stdin);
	freopen("chocolatebox.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m >> k >> p1 >> p2;
    for(int i = 1;i <= n;i ++) cin >> a[i];
    if(p1){
        pre1[0] = 1;
        for(int i = 1;i <= n;i ++){
        	pre1[i] = 1LL * pre1[i - 1] * a[i] % p1;
		}
    }

    if(p2){
        phi = euler(p2);
        pre2[0] = 1; o[0] = 0;
        for(int i = 1;i <= n;i ++){
            ll t = 1LL * pre2[i - 1] * a[i];
            o[i] = o[i - 1] || (t >= phi);
            pre2[i] = t % phi;
        }
    }

    while(m --){
        int op, l, r; cin >> op >> l >> r;
        if(op == 1 && p1){
            cout << 1LL * pre1[r] * inv(pre1[l - 1], p1) % p1 << '\n';
        }
		else if (op == 2 && p2){
            int e = 1LL * pre2[r] * inv(pre2[l - 1], phi) % phi;
            if(!o[l - 1]){
                ll t = 1LL * pre2[r] * inv(pre2[l - 1], phi);
                if(t < phi) o[r] = 0;
            }
            ll exp = o[r] ? (e + phi) : e;
            cout << qpow(k, exp, p2) << '\n';
        }
    }
    return 0;
}