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

看到5e6的数据,500ms的时限,O(NlogN)快速幂直接跑肯定会T掉,那我们就要考虑优化一下式子。

我们令s=1na[i] ,那我们给第i个式子通分,就为kis/a[i]s

s/a[i] 就相当于1i1a[i]i+1na[i]

因此我们只需要预处理出前缀积和后缀积,最后只需要求一遍s[n]的逆元就可以。

点击查看代码
#include<bits/stdc++.h>
using namespace std;

#define int long long

const int N=6e6+107;
int n,p,k,ans;
int a[N],b[N],s[N];

int read()
{
	int f=1,s=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
	return f*s;
}

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

signed main()
{
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	n=read(),p=read(),k=read();
	s[0]=1;
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		s[i]=s[i-1]*a[i]%p;
	}
	b[n+1]=1; a[n+1]=1;
	for(int i=n;i>=1;i--) b[i]=b[i+1]*a[i+1]%p;

	int j=k;
	for(int i=1;i<=n;i++,j=j*k%p)
	{
		ans=(ans+s[i-1]*j%p*b[i]%p)%p;
	}

	printf("%lld",ans*qpow(s[n],p-2)%p);
}

posted @   zhengchenxi  阅读(48)  评论(6编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)
点击右上角即可分享
微信分享提示