怎么优化这个代码的空间复杂度?
#include <cstdio>
#define mod %
#define ll long long
using namespace std;
const int N = 5e6 + 1;
int inv, n, p, k, ans, a[N];
ll s[N], sv[N], m[N];
inline ll qpow(ll a, ll b) {
ll res = 1;
while (b) {
if (b & 1) {
res = res * a mod p;
}
a = a * a mod p;
b >>= 1;
}
return res mod p;
}
int main() {
scanf("%d%d%d", &n, &p, &k);
s[0] = 1;
for(int i = 1; i <= n; ++i) {
scanf("%d", a + i);
s[i] = s[i - 1] * a[i] mod p;
}
m[0] = 1;
for(int i = 1; i <= n; ++i) {
m[i] = m[i - 1] * k mod p;
}
sv[n] = qpow(s[n], p - 2);
for(int i = n; i > 0; --i) {
sv[i - 1] = sv[i] * a[i] mod p;
}
for(int i = 1; i <= n; ++i) {
inv = (sv[i] * s[i - 1] mod p) * m[i] mod p;
ans = (inv + ans) mod p;
}
printf("%d", ans mod p);
return 0;
}