代码如下,用 scanf 的代码开 O2 跑最慢的点差 613ms ,30 分,是一定要用快读吗?
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
int n;
ll p,k,a[5000005],s[5000005],val[5000005];
ll qpow(ll b,int n){
if(n==1)
return b;
ll ans=qpow(b,n/2);
ans=ans*ans%p;
if(n%2)
ans=ans*b%p;
return ans;
}
int main(){
scanf("%d%lld%lld",&n,&p,&k);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
s[0]=1LL;
for(int i=1;i<=n;i++)
s[i]=s[i-1]*a[i]%p;
val[n]=qpow(s[n],p-2);
for(int i=n-1;i;i--)
val[i]=val[i+1]*a[i+1]%p;
ll mult=1LL,ans=0LL;
for(int i=1;i<=n;i++){
mult=mult*k%p;
ans=(ans+mult*val[i]%p*s[i-1])%p;
}
printf("%lld\n",ans);
return 0;
}