“百度松果學堂”宣佈成立,進一步加速推動 AI 人才培養
阿新 • • 發佈:2021-08-18
以下運算均在模 \(p\) 意義下。
設 \(s_i=\displaystyle\prod_{k=1}^{i} a_k\)。
則 \(s_i^{-1}=\dfrac{1}{\displaystyle\prod_{k=1}^{i} a_k}\)
則 \(s_i^{-1}=s_{i+1}^{-1}\times a_{i+1}\)。
\(a_i^{-1}=s_i^{-1}\times s_{i-1}\)。
最後,逆元 \(a^{-1}\bmod p\) 等價於解 \(ax\equiv 1\pmod{p}\),等價於 \(ax+py=1(\gcd(a,p)=1)\)。
YJX AK IOI#include<bits/stdc++.h> using namespace std; const int maxn=5e6+5; inline int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} return x*f; } int n,p; long long k; void exgcd(int a,int b,int &x,int &y){ if(b==0){x=1,y=0;return ;} exgcd(b,a%b,y,x); y-=a/b*x; } inline int inv(int a){ int x,y; exgcd(a,p,x,y); return (x%p+p)%p; } int a[maxn]; long long s[maxn],si[maxn]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); n=read(),p=read(),k=read(); s[0]=1; for(register int i=1;i<=n;i++){ a[i]=read(); s[i]=s[i-1]%p*a[i]; s[i]%=p; } si[n]=inv(s[n]); for(register int i=n-1;i>=1;i--){ si[i]=si[i+1]%p*a[i+1]%p;si[i]%=p; } long long res=0,z=1; for(register int i=1;i<=n;i++){ z*=k;z%=p; res+=(z*si[i]%p*s[i-1]%p)%p; res%=p; } cout<<res; return 0; }