[题解]P5431 【模板】模意义下的乘法逆元 2

可恶,卡常好难受。

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

将分数通分,第\(i\)个分数是\(\frac{k^i*fac\div a[i]}{fac}\)\(fac\)表示所有元素的积。

我们可以用\(lr,rl\)记录\(a\)的前缀后缀积,第\(i\)个分数就是\(\frac{k^i*lr[i-1]*rl[i+1]}{lr[n]}\)。这样分母都是\(lr[n]\),分子就是上面一串的和。

然后用一遍逆元求出答案即可,这里用费马小定理。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,p,k,a[5000010];
int lr[5000010],rl[5000010];
int read(){
int x=0,w=1;
char ch=0;
while(ch<'0'||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
return x*w;
}
int qp(int a,int b){
int ans=1;
while(b){
if(b&1) ans=(ans*a)%p;
a=a*a%p;
b>>=1;
}
return ans;
}
signed main(){
n=read(),p=read(),k=read();
lr[0]=1,rl[n+1]=1;
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) lr[i]=lr[i-1]*a[i]%p;
for(int i=n;i>=1;i--) rl[i]=rl[i+1]*a[i]%p;
int frac1=0,frac2=lr[n],t=k;
for(int i=1;i<=n;i++){
frac1=(frac1+lr[i-1]*rl[i+1]%p*t%p)%p;
t=(t*k)%p;
}
cout<<frac1*qp(frac2,p-2)%p;
return 0;
}
posted @   Sinktank  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2025-3-6 6:4:1 TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2024 Sinktank - 1328312655@qq.com
Illustration from 稲葉曇『リレイアウター/Relayouter/中继输出者』,by ぬくぬくにぎりめし.
点击右上角即可分享
微信分享提示