测评记录
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 5e6 + 5;
typedef long long ll;
inline ll read() {
ll x = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + (ch ^ 48);
ch = getchar();
}
return x;
}
ll p;
int n, q, front[maxn], back[maxn], a[maxn], k[maxn];
ll inv(int x) {
if (x == 1) return 1;
return ((ll)(p - p / x) * inv(p % x)) % p;
}
int main() {
n = read(), p = read(), q = read();
k[0] = front[0] = back[n + 1] = 1;
for (register int i = 1; i <= n; ++i) {
a[i] = read();
front[i] = ((ll)front[i - 1] * a[i]) % p;
k[i] = ((ll)k[i - 1] * q) % p;
}
for (register int i = n; i >= 1; --i) {
back[i] = ((ll)back[i + 1] * a[i]) % p;
}
ll ans = 0;
for (register int i = 1; i <= n; ++i) {
ans = (ans + ((ll)k[i] * ((ll)front[i - 1] * back[i + 1]) % p) % p) % p;
}
ans = (ans * inv(front[n])) % p;
cout << ans;
return 0;
}