1. 程式人生 > 資訊 >“百度松果學堂”宣佈成立,進一步加速推動 AI 人才培養

“百度松果學堂”宣佈成立,進一步加速推動 AI 人才培養

以下運算均在模 \(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)\)

#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;
} 
YJX AK IOI