题意
给出
n
n
n个数
A
A
A,和一个
k
k
k,求:
∑
i
=
1
n
k
i
a
i
\sum_{i=1}^{n}\frac{k^i}{a_i}
∑i=1naiki
思路
看起来就是若干个分数相加,我们可以通分得到:
∑
i
=
1
n
k
i
(
s
/
a
i
)
s
\sum_{i=1}^{n}\frac{k^i(s/a_i)}{s}
∑i=1nski(s/ai)
其中
s
s
s为所有数的乘积,
s
/
a
i
s/a_i
s/ai用前缀后缀积处理就可以了。
代码
#include<cstdio>
int n, p, k, ans;
int a[5000001], pre[5000001], nxt[5000001];
int read() {
int res = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') c = getchar(), f = c == '-' ? -1 : f;
while (c >= '0' && c <= '9') res = (res << 3) + (res << 1) + c - 48, c = getchar();
return res * f;
}
int power(int a, int b) {
long long res = 1;
for (; b; b >>= 1) {
if (b & 1) res = res * a % p;
a = (long long)a * a % p;
}
return res;
}
int main() {
n = read();
p = read();
k = read();
for (int i = 1; i <= n; i++)
a[i] = read();
pre[0] = 1;
nxt[n + 1] = 1;
for (int i = 1; i <= n; i++) {
pre[i] = (long long)pre[i - 1] * a[i] % p;
nxt[n - i + 1] = (long long)nxt[n - i + 2] * a[n - i + 1] % p;
}
for (int i = 1, j = k; i <= n; i++, j = (long long)j * k % p)
ans = (ans + (long long)j * pre[i - 1] % p * nxt[i + 1]) % p;
printf("%d", (long long)ans * power(pre[n], p - 2) % p);
}