P5431 乘法逆元 2
等式变换
取模后的被除数遇除法 变成 要乘逆元
没取之前,可以直接除再取模
#include<bits/stdc++.h> using namespace std; namespace{ template<typename T> inline void read(T &s){ T f=1;s=0;char ch=getchar(); for(;!isdigit(ch);ch=getchar()) f=-1; for(;isdigit(ch);ch=getchar()) s=(s<<1)+(s<<3)+(ch^48); } } #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define ll long long int const N=5e6+7; ll n,mod,k; ll b[N],b2[N],a[N]; //kk[N] inline int ksm(ll a,int b){ ll res=1; while(b){ if(b&1) (res*=a)%=mod; b >>= 1; a*=a; a%=mod; } return res; } int main(){ //fio; //cin >> n >> mod >> k; read(n);read(mod);read(k); //kk[0]=1; b[0]=1; for(register int i=1;i<=n;++i){ //cin >> a[i]; read(a[i]); //kk[i]=kk[i-1]*k%mod; b[i]=b[i-1]*a[i]%mod; } b2[n+1]=1;ll ans=0,kk=1; for(register int i=n;i>=1;--i){ b2[i]=b2[i+1]*a[i]%mod; } for(register int i=1;i<=n;++i){ (kk*=k)%=mod; ans+=b[i-1]*b2[i+1]%mod *kk%mod; ans%=mod; } ans*=ksm(b[n],mod-2); cout << ans%mod ; return 0; }