这题一定要用快读吗?
查看原帖
这题一定要用快读吗?
305891
夜明楼主2022/2/1 16:11

代码如下,用 scanfscanf 的代码开 O2O2 跑最慢的点差 613ms613ms3030 分,是一定要用快读吗?

#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
int n;
ll p,k,a[5000005],s[5000005],val[5000005];
ll qpow(ll b,int n){
	if(n==1)
		return b;
	ll ans=qpow(b,n/2);
	ans=ans*ans%p;
	if(n%2)
		ans=ans*b%p;
	return ans;
}
int main(){
	scanf("%d%lld%lld",&n,&p,&k);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	s[0]=1LL;
	for(int i=1;i<=n;i++)
		s[i]=s[i-1]*a[i]%p;
	val[n]=qpow(s[n],p-2);
	for(int i=n-1;i;i--)
		val[i]=val[i+1]*a[i+1]%p;
	ll mult=1LL,ans=0LL;
	for(int i=1;i<=n;i++){
		mult=mult*k%p;
		ans=(ans+mult*val[i]%p*s[i-1])%p;
	}
	printf("%lld\n",ans);
	return 0;
}
2022/2/1 16:11
加载中...