1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include<cstdio> #define re register const int MAXn = 5e6; #define int long long
template <class T> inline void read(T &a) { register char c;while (c = getchar(), c < '0' || c >'9');register T x(c - '0');while (c = getchar(), c >= '0' && c <= '9')x = (x << 1) + (x << 3) + c - '0';a = x; }
int power(int x, int y, int mod) { int ans = 1; while (y) { if (y & 1) { ans = ans * x % mod; } x = x * x % mod; y >>= 1; } return ans; } int inv(int n, int mod) { int inv = power(n, mod - 2, mod); return (inv % mod + mod) % mod; }
int n, p, k, a[MAXn + 10], pi[MAXn + 10], mi[MAXn + 10], invv, ans; signed main() { read(n), read(p), read(k); pi[0] = 1; for (re int i = 1; i <= n; ++i) { read(a[i]); pi[i] = (pi[i - 1] * a[i]) % p; } mi[0] = 1; for (re int i = 1; i <= n; ++i) { mi[i] = (mi[i - 1] * k) % p; } invv = inv(pi[n], p); for (re int i = n; i; --i) { ans = (ans + mi[i] * (invv * pi[i - 1] % p)) % p; invv = (invv * a[i]) % p; } printf("%lld\n", ans); }
|