全RE 0pts 求助!
查看原帖
全RE 0pts 求助!
528802
AC_notonlyAC楼主2025/1/28 13:07
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q,a[200005],zuhe[200005][30],mod=19940417,tmp[30];
ll mymin(ll a,ll b) 
{
	if(a<b) return a;
	else return b;
}
struct Node
{
	ll c[30],sum,taga;
	bool tagm;
	Node(){taga=tagm=sum=0;memset(c,0,sizeof(c));} 
}node[500005];
void csh()
{
	zuhe[0][0]=1;
	for(ll i=1;i<=n;i++)
	{
		zuhe[i][0]=1;
		for(ll j=1;j<=mymin(20ll,i);j++)
		{
			zuhe[i][j]=zuhe[i-1][j]+zuhe[i-1][j-1];
			zuhe[i][j]%=mod;
		}
	}
}
void pushup(ll w)
{
	memset(node[w].c,0,sizeof(node[w].c));
	ll ls=2*w,rs=2*w+1;
	for(ll i=0;i<=mymin(20ll,node[ls].sum);i++)
	{
		for(ll j=0;j<=mymin(20ll-i,node[rs].sum);j++)
		{
			node[w].c[i+j]+=node[ls].c[i]*node[rs].c[j];
		}
	}
	for(ll i=0;i<=mymin(20ll,node[w].sum);i++)
	{
		node[w].c[i]%=mod;
	} 
}
void build(ll w,ll l,ll r)
{
	node[w].sum=r-l+1;
	if(l==r)
	{
		node[w].c[0]=1;
		node[w].c[1]=(a[l]%mod+mod)%mod;
		return ;
	}
	ll mid=(l+r)/2,ls=2*w,rs=2*w+1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(w);
}
void add(ll w,ll k)
{
	if(!w||!k) return ;
	tmp[0]=1;
	for(ll i=1;i<=mymin(2011,node[w].sum);i++)
	{
		tmp[i]=tmp[i-1]*k;
		tmp[i]%=mod;
	}
	for(ll i=mymin(2011,node[w].sum);i;i--)
	{
		for(ll j=0;j<i;j++)
		{
			node[w].c[i]=node[w].c[i]+node[w].c[j]*tmp[i-j]%mod*zuhe[node[w].sum-j][i-j];
			node[w].c[i]%=mod;
		}
	}
	node[w].taga+=k;
	node[w].taga%=mod;
}
void mul(ll w)
{
	if(!w) return ;
	for(ll i=1;i<=mymin(2011,node[w].sum);i++)
	{
		node[w].c[i]=(i%2)?mod-node[w].c[i]:node[w].c[i];
	}
	node[w].taga=mod-node[w].taga;
	node[w].tagm^=1;
}
void pushdown(ll w)
{
	ll ls=w*2,rs=w*2+1;
	if(node[w].tagm)
	{
		mul(ls);
		mul(rs);
		node[w].tagm=0;
	}
	if(node[w].taga)
	{
		add(ls,node[w].taga);
		add(rs,node[w].taga);
		node[w].taga=0;
	}
}
void aadd(ll w,ll l,ll r,ll ql,ll qr,ll k)
{
	if(ql<=l&&r<=qr)
	{
		add(w,k);
		return ;
	}
	pushdown(w);
	ll mid=(l+r)/2,ls=2*w,rs=2*w+1;
	if(ql<=mid) aadd(ls,l,mid,ql,qr,k);
	if(qr>mid) aadd(rs,mid+1,r,ql,qr,k);
	pushup(w);
}

void amul(ll w,ll l,ll r,ll ql,ll qr)
{
	if(ql<=l&&r<=qr)
	{
		mul(w);
		return ;
	}
	pushdown(w);
	ll mid=(l+r)/2,ls=2*w,rs=2*w+1;
	if(ql<=mid) amul(ls,l,mid,ql,qr);
	if(qr>mid) amul(rs,mid+1,r,ql,qr);
	pushup(w);
}
Node hb(Node x,Node y)
{
	Node z;
	z.sum=x.sum+y.sum;
	for(ll i=0;i<=mymin(20ll,x.sum);i++)
	{
		for(ll j=0;j<=mymin(20ll-i,y.sum);j++)
		{
			z.c[i+j]=z.c[i+j]+x.c[i]*y.c[j];
			z.c[i+j]%=mod;
		}
	}
	return z;
}
Node getsum(ll w,ll l,ll r,ll ql,ll qr)
{
	if(ql<=l&&r<=qr)
	{
		return node[w];
	}
	pushdown(w);
	int mid=(l+r)/2,ls=2*w,rs=2*w+1;
	if(qr<=mid) return getsum(ls,l,mid,ql,qr);
	else if(ql>mid) return getsum(rs,mid+1,r,ql,qr);
	else return hb(getsum(ls,l,mid,ql,qr),getsum(rs,mid+1,r,ql,qr));
}
int main()
{
	cin>>n>>q;
	for(ll i=1;i<=n;i++) cin>>a[i];
	node[0].c[0]=1;
	csh();
	build(1,1,n);
	while(q--)
	{
		char cc;
		ll a,b,c;
		cin>>cc>>a>>b;
		if(cc=='I')
		{
			cin>>c;
			c=(c%mod+mod)%mod;
			aadd(1,1,n,a,b,c);
		}
		else if(cc=='R')
		{
			amul(1,1,n,a,b);
		}
		else
		{
			cin>>c;
			cout<<(getsum(1,1,n,a,b).c[c]%mod+mod)%mod<<endl;
		}
	}
	return 0;
}

0pts 求 助

2025/1/28 13:07
加载中...