30分TLE求调
查看原帖
30分TLE求调
477821
toolong114514楼主2023/7/13 20:02
#include<iostream>
#include<cstdlib>
#include<cstdio>
//#pragma GCC optimize("Ofast")
using namespace std;
const int N=5e6+10;
typedef long long ll;
ll qpow(ll x,ll y,ll z){
	ll s=1;
	while(y) {
		if(y&1) s=1ll*s*x%z;
		x*=x;
		x%=z;
		y>>=1;
	}
	return s%z;
}
int mul(int a,int b,int p) {
	int s=0;
	for(;b;b>>=1) {
		if(b&1) s=(s+a)%p;
		a=(a+a)%p;
	}
	return s%p;
}
inline int read(){
	int res=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){res=res*10+ch-'0';ch=getchar();}
	return res*f;
}
ll qz[N];
ll a[N];
ll num[N];
ll n,p,k,ans,cnt=1;
int main(){
	//freopen("P5431_1.in","r",stdin);
	ios::sync_with_stdio(false);
	n=read();
	p=read();
	k=read();
	qz[0]=1;
	for(int i=1;i<=n;i++){
		num[i]=read();
		qz[i]=((qz[i-1]%p)*(num[i]%p))%p;
	}
	a[n]=qpow(qz[n],p-2,p);
	for(int i=n;i>=1;i--){
		a[i-1]=mul(a[i],num[i],p);
	}
	for(int i=1;i<=n;i++){
		cnt=(cnt*k)%p;
		ans+=mul(cnt,mul(a[i],qz[i-1],p),p);
	}
	cout<<ans%p;
	return 0;
}
2023/7/13 20:02
加载中...