全WA求调
查看原帖
全WA求调
527300
W_C_B_H楼主2024/8/21 11:33

rt,评测记录,Code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define reg register
#define N 5000005
int n,p,k,a[N],ans=0,pre[N],suf[N];
inline int read()
{
	bool f=0;
	char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch='-')
		{
			f=1;
		}
		ch=getchar();
	}
	int x=ch-'0';
	while((ch=getchar())>='0' && ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);	//通俗版本 x=x*10+(ch-'0');
	}
	return (f?-x:x);
}
inline void write(int x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>9)
	{
		write(x/10);
	}
	putchar(x%10+'0');
}
inline int inv(int x,int y)	//求 x 在模 y 意义下的乘法逆元 
{
	if(x==1)
	{
		return 1;
	}
	return (y-y/x)*inv(y%x,y)%y;
}
signed main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	n=read();
	p=read();
	k=read();
	pre[0]=1;
	suf[n+1]=1;
	for(reg int i=1;i<=n;++i)
	{
		pre[i]=pre[i-1]*(a[i]=read())%p;	//输入并求出前缀积 
	}
	for(reg int i=n;i;--i)
	{
		suf[i]=suf[i+1]*a[i]%p;	//求出后缀积 
	}
	for(reg int i=1,j=k; i<=n; ++i,j=j*k%p)
	{
		ans=(ans+j*pre[i-1]%p*suf[i+1]%p)%p;
	}
	ans=ans*inv(pre[n],p)%p;
	write(ans);
	return 0;
}

思路是先求出前、后缀积并通分,分母用逆元处理。

2024/8/21 11:33
加载中...