简单卡常
查看原帖
简单卡常
367190
LemonLime楼主2020/8/7 18:28

评测记录

不会是评测机波动吧

毒瘤鱼

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cctype>
using namespace std;

const int MAXN=5e6+5;
typedef long long ll;
int n,p,k,ans;
int a[MAXN],inv[MAXN];
int prod1[MAXN],prod2[MAXN];

namespace mine
{
	int read(void)
	{
		int num=0;
		bool negative=false;
		char c=getchar();
		while(!isdigit(c) && c!='-')	{
			c=getchar();
		}
		if(c=='-')	{
			negative=true;
		} else {
			num=c-'0';
		}
		c=getchar();
		while(isdigit(c)) {
			num=(num<<1)+(num<<3)+(c^48);
			c=getchar();
		}
		return negative?0-num:num;
	}
	void print(int a)
	{
		if(a<0)	{
			putchar('-'),a=-a;
		}
		if(a>9)	{
			print(a/10);
		}
		putchar(a%10+'0');
	}
}

int qpow(int base,int nk)
{
	int res=1;
	while(nk) {
		if(nk&1) {
			res=1ll*res*base%p;
		}
		nk>>=1;
		base=1ll*base*base%p;
	}
	return res;
}

int main()
{
	n=mine::read();
	p=mine::read();
	k=mine::read();
	for(register int i=1; i<=n; i++) {
		a[i]=mine::read();
	}
	prod1[0]=prod2[n+1]=1;
	for(register int i=1; i<=n; i++) {
		prod1[i]=1ll*prod1[i-1]*a[i]%p;
	}
	for(register int i=n; i>=1; i--) {
		prod2[i]=1ll*prod2[i+1]*a[i]%p;
	}
	inv[n+1]=qpow(prod1[n],p-2)%p;
	for(register int i=1; i<=n; i++) {
		inv[i]=1ll*inv[n+1]*prod1[i-1]%p*prod2[i+1]%p;
	}
	register ll K=1;
	for(register int i=1; i<=n; i++) {
		K=1ll*K*k%p;
		ans=(ans+1ll*K*inv[i]%p)%p;
	}
	mine::print(ans);
	putchar('\n');
	return 0;
}
2020/8/7 18:28
加载中...