mxqz
查看原帖
mxqz
409372
Alice_and_Bob楼主2023/7/21 09:11

悬关,求助喵。

wa+re 30pts。

#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")
// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("inline")
#include<bits/stdc++.h>
#define ll long long
#define mp make_pair
//#define int ll
using namespace std;
const int N=1e5+10,B=20,mod=19940417;
inline int read(){
    int d=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){d=(d<<1)+(d<<3)+(ch^48);ch=getchar();}
    return d*f;
}
int C[N][B+3];
struct Node{
	int f[B+3],len;
	Node(){len=0;memset(f,0,sizeof(f));}
};
inline int min(const int &x,const int &y){return x<y?x:y;}
Node operator +(Node a,Node b){
	Node res;res.len=a.len+b.len;
	for(int i=0;i<=min(B,a.len);i++)
		for(int j=0;j<=min(B-i,b.len);j++)
			res.f[i+j]=(res.f[i+j]+1ll*a.f[i]*b.f[j]%mod)%mod;
	return res;
}
Node operator +(Node a,int v){
	Node res;res.len=a.len;
	for(int i=0,k=1;i<=min(B,a.len);i++,k=1)
		for(int j=i;~j;j--,k=1ll*k*v%mod)
			res.f[i]=(res.f[i]+1ll*a.f[j]*k%mod*C[a.len-j][i-j]%mod)%mod;
	return res;
}
void rev(Node &a){for(int i=1;i<=min(B,a.len);i+=2) a.f[i]=(mod-a.f[i])%mod;}
int n,q,a[N];
struct Seg{
	Node s[N<<2];int tag[N<<2];int tg[N<<2];
	inline void pushup(int rt){s[rt]=s[rt<<1]+s[rt<<1|1];}
	inline void pd(int rt){
		if(tg[rt]){
			rev(s[rt<<1]);rev(s[rt<<1|1]);
			tag[rt<<1]=(mod-tag[rt<<1])%mod;tag[rt<<1|1]=(mod-tag[rt<<1|1])%mod;
			tg[rt<<1]^=1;tg[rt<<1|1]^=1;tg[rt]=0;
		}
		if(tag[rt]){
			s[rt<<1]=s[rt<<1]+tag[rt];tag[rt<<1]=(tag[rt<<1]+tag[rt])%mod;
			s[rt<<1|1]=s[rt<<1|1]+tag[rt];tag[rt<<1|1]=(tag[rt<<1|1]+tag[rt])%mod;
			tag[rt]=0;
		}
	}
	void build(int rt,int l,int r){
		tag[rt]=tg[rt]=0;if(l==r) return s[rt].f[0]=1,s[rt].f[1]=a[l],s[rt].len=1,void();
		int mid=(l+r)>>1;
		build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
		pushup(rt);
	}
	void change(int rt,int l,int r,int ql,int qr){
		if(ql<=l&&r<=qr) return rev(s[rt]),tg[rt]^=1,tag[rt]=(mod-tag[rt])%mod,void();
		pd(rt);int mid=(l+r)>>1;
		if(ql<=mid) change(rt<<1,l,mid,ql,qr);
		if(qr>mid) change(rt<<1|1,mid+1,r,ql,qr);
		pushup(rt);
	}
	void upd(int rt,int l,int r,int ql,int qr,int v){
		if(ql<=l&&r<=qr) return s[rt]=s[rt]+v,tag[rt]=(tag[rt]+v)%mod,void();
		pd(rt);int mid=(l+r)>>1;
		if(ql<=mid) upd(rt<<1,l,mid,ql,qr,v);
		if(qr>mid) upd(rt<<1|1,mid+1,r,ql,qr,v);
		pushup(rt);
	}
	Node qry(int rt,int l,int r,int ql,int qr){
		if(ql<=l&&r<=qr) return s[rt];
		pd(rt);int mid=(l+r)>>1;
		if(qr<=mid) return qry(rt<<1,l,mid,ql,qr);
		if(ql>mid) return qry(rt<<1|1,mid+1,r,ql,qr);
		return qry(rt<<1,l,mid,ql,qr)+qry(rt<<1|1,mid+1,r,ql,qr);
	}
}t;
signed main(){
	n=read();q=read();
	C[0][0]=1;
	for(int i=1;i<=n;i++){
		C[i][0]=1;
		for(int j=1;j<=min(i,B);j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
	}
	for(int i=1;i<=n;i++) a[i]=(read()%mod+mod)%mod;
	t.build(1,1,n);
	for(int i=1;i<=q;i++){
		char op=getchar();
		if(op=='I'){
			int l=read(),r=read(),x=(read()%mod+mod)%mod;
			t.upd(1,1,n,l,r,x);
		}
		else if(op=='R'){
			int l=read(),r=read();
			t.change(1,1,n,l,r);
		}else{
			int l=read(),r=read(),x=read();
			Node ans=t.qry(1,1,n,l,r);
			printf("%d\n",ans.f[x]);
		}
	}
	return 0;
}
2023/7/21 09:11
加载中...