rt,评测记录,Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define reg register
#define N 5000005
int n,p,k,a[N],ans=0,pre[N],suf[N];
inline int read()
{
bool f=0;
char ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch='-')
{
f=1;
}
ch=getchar();
}
int x=ch-'0';
while((ch=getchar())>='0' && ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48); //通俗版本 x=x*10+(ch-'0');
}
return (f?-x:x);
}
inline void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
{
write(x/10);
}
putchar(x%10+'0');
}
inline int inv(int x,int y) //求 x 在模 y 意义下的乘法逆元
{
if(x==1)
{
return 1;
}
return (y-y/x)*inv(y%x,y)%y;
}
signed main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
n=read();
p=read();
k=read();
pre[0]=1;
suf[n+1]=1;
for(reg int i=1;i<=n;++i)
{
pre[i]=pre[i-1]*(a[i]=read())%p; //输入并求出前缀积
}
for(reg int i=n;i;--i)
{
suf[i]=suf[i+1]*a[i]%p; //求出后缀积
}
for(reg int i=1,j=k; i<=n; ++i,j=j*k%p)
{
ans=(ans+j*pre[i-1]%p*suf[i+1]%p)%p;
}
ans=ans*inv(pre[n],p)%p;
write(ans);
return 0;
}
思路是先求出前、后缀积并通分,分母用逆元处理。