在不用快读的情况下:
#include <iostream>
int a[5000005], s[5000005], sv[5000005], inv[5000005];
int qpow(int a, int b, int p)
{
int res = 1;
while (b != 0)
{
if (b & 1)
res = 1ll * res * a % p;
a = 1ll * a * a % p;
b >>= 1;
}
return res;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
s[0] = 1;
int n, p, k, ans = 0;
std::cin >> n >> p >> k;
for (int i = 1; i <= n; i++)
{
std::cin >> a[i];
s[i] = 1ll * a[i] * s[i - 1] % p;
}
sv[n] = qpow(s[n], p - 2, p);
for (int i = n - 1; i >= 1; i--)
sv[i] = 1ll * sv[i + 1] * a[i + 1] % p;
for (int i = 1; i <= n; i++)
inv[i] = 1ll * sv[i] * s[i - 1] % p;
for (int i = 1, j = k; i <= n; i++, j = 1ll * j * k % p)
ans = (ans + 1ll * j * inv[i]) % p;
std::cout << ans << "\n";
return 0;
}
s 的初始化,基本被卡在 550 ms 出头 TLE。#include <iostream>
int a[5000005], s[5000005] = {1}, sv[5000005], inv[5000005];
int qpow(int a, int b, int p)
{
int res = 1;
while (b != 0)
{
if (b & 1)
res = 1ll * res * a % p;
a = 1ll * a * a % p;
b >>= 1;
}
return res;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int n, p, k, ans = 0;
std::cin >> n >> p >> k;
for (int i = 1; i <= n; i++)
{
std::cin >> a[i];
s[i] = 1ll * a[i] * s[i - 1] % p;
}
sv[n] = qpow(s[n], p - 2, p);
for (int i = n - 1; i >= 1; i--)
sv[i] = 1ll * sv[i + 1] * a[i + 1] % p;
for (int i = 1; i <= n; i++)
inv[i] = 1ll * sv[i] * s[i - 1] % p;
for (int i = 1, j = k; i <= n; i++, j = 1ll * j * k % p)
ans = (ans + 1ll * j * inv[i]) % p;
std::cout << ans << "\n";
return 0;
}
请求放宽时限。