求助 【混乱度】为什么每个subtask的最后一个点挂了QAQ
查看原帖
求助 【混乱度】为什么每个subtask的最后一个点挂了QAQ
35891
huangzirui楼主2021/6/22 11:33

怀疑是有什么特殊性质(

https://www.luogu.com.cn/record/51988672

#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
	//读入非负数
	char c;long long w=0;do c=getchar();while(c>'9'||c<'0');
	do w=w*10+c-'0',c=getchar();while(c>='0'&&c<='9');return w;
}
const int maxn=500010;
long long i,j,k,n,m,mod;
int num[maxn],g[maxn][70],sum[maxn][70],x;
long long a[maxn]={1},jc[11],ny[11],s[maxn],POW[maxn];
long long ans=0;
long long ksm(long long sum,long long num){
	long long ans=1;
	while(num){
		if(num&1)ans=ans*sum%mod;
		sum=sum*sum%mod;
		num>>=1;
	}return ans;
}
int W[15][15];
inline int C(int a,int b){
	if(W[a][b])return W[a][b];
	return W[a][b]=jc[a]*ny[b]*ny[a-b]%mod;
}
signed main(){
	cin>>n>>mod;
	int N=63;
	jc[0]=1;for(i=1;i<mod;i++)jc[i]=jc[i-1]*i%mod;
	for(i=0;i<mod;i++)ny[i]=ksm(jc[i],mod-2);
	POW[0]=1;
	for(i=1;i<maxn;i++){
		if(N==63 && 1e18/mod<=POW[i-1]+5)N=i;
		POW[i]=POW[i-1]*mod;
	}
	for(i=1;i<=n;i++)a[i]=read();
	for(i=1;i<=n;i++){
		if(a[i]+a[x]==0)s[x]++;
		else{
			a[++x]=a[i];
			s[x]=1;
		}
	}
    for(i=1;i<=x;i++){
        long long u=a[i];
		for(j=0;j<=N;j++){
			g[i][j]=u%mod;
			u/=mod;
			sum[i][j]=sum[i-1][j]+g[i][j];
		}
    }
	long long t=0;
	for(i=1;i<=x;i++){
		// cout<<"i="<<i<<' '<<s[i]<<endl;
		t+=s[i];
		long long lastans=1;
		if(!a[i]){
            ans+=s[i]*(s[i]+1)/2;
        	continue;
		}
		for(j=0;j<=N;j++)num[j]=0;
		for(j=i;j<=x;j++){
			// cout<<"j="<<j<<' '<<a[j]<<' '<<ans<<endl;
			if(!a[j]){
				ans+=1ll*lastans*t*s[j];
				continue;
			}
			for(k=0;k<=N;k++){
				num[k]+=g[j][k];
				// cout<<"num["<<k<<"]="<<num[k]<<endl;
				if(g[j][k])lastans=lastans*C(sum[j][k]-sum[i-1][k],sum[j-1][k]-sum[i-1][k])%mod;
				if(num[k]>=mod)break;
			}
			if(!lastans)break;
			// cout<<"lastans="<<lastans<<" t="<<t<<endl;
			ans+=1ll*lastans*t;
		}t=0;
	}cout<<ans<<endl;
}
2021/6/22 11:33
加载中...