头像

欢迎来到我的博客

分享题解与总结

P5431 模意义下的乘法逆元 2

P5431 模意义下的乘法逆元 2

P5431 【模板】模意义下的乘法逆元 2 - 洛谷

非常不友好的题

卡常非常严格

下面的代码仍然有部分样例TLE(请勿参考)

鉴于写的自闭了,还是把中间能看的代码发出来

但是可以通过这题,获得求\(i!\)\(1/(i!)\)时一样的灵感

代码:

ll n,p,k,inv,ans;
int arr[N],kpow[N],f[N],g[N];//f:前缀积 g:f逆 

inline ll qpow(ll a,ll b)
{
	ll ans=1;
	while(b){
		if(b&1) ans=(ll)ans*a%p;
		a=(ll)a*a%p;
		b>>=1;
	}
	return ans;
}

void init()//初始化kpow,f,g 
{
	kpow[0]=1;
	for(int i=1;i<=n;++i){
		kpow[i]=(ll)kpow[i-1]*k%p;
	}
	
	f[0]=1;
	for(int i=1;i<=n;++i){
		f[i]=(ll)f[i-1]*arr[i]%p;
	}
	
	g[n]=qpow(f[n],p-2);
	for(int i=n-1;i>=1;--i){
		g[i]=(ll)g[i+1]*arr[i+1]%p;
	}
}

int main()
{
	ios::sync_with_stdio(0),cin.tie(0);
	ll d=0,s=0,t=0;
	cin>>n>>p>>k;
	for(int i=1;i<=n;++i){
		cin>>arr[i];
	}
	init();
	for(int i=1;i<=n;++i){
		inv=(ll)g[i]*f[i-1]%p;
		ans=(ans+(ll)kpow[i]*inv%p)%p;
	}
	cout<<ans;
	return 0;
}

posted @ 2026-07-04 12:08  king_steph1209  阅读(5)  评论(0)    收藏  举报