Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
40457 LYLAKIOI 【BJ】T1 C++ 运行超时 90 1000 MS 249924 KB 3481 2026-03-05 20:05:28

Tests(45/46):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define pb push_back #define eb emplace_back #define ppc __builtin_popcount using namespace std; typedef long long ll; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,q,w[5005],cnt[5005]; const int p=998244353; inline int add(int a,int b){if((a+=b)>=p)a-=p;return a;} const int G=3,Gi=332748118; inline int qp(int a,int b){ int res=1; for(;b;b>>=1,a=a*1llu*a%p)if(b&1)res=res*1llu*a%p; return res; } namespace Poly{ const int n=13; int rev[1<<n],mul[2][1<<n]; void init(){ up(i,1,(1<<n)-1)rev[i]=(rev[i>>1]>>1)|((i&1)<<n-1); up(op,0,1)for(int k=1;k<(1<<n);k<<=1){ int v=qp(op?Gi:G,(p-1)/k/2); mul[op][k]=1;up(j,1,k-1)mul[op][j+k]=mul[op][j+k-1]*1llu*v%p; } } void ntt(int *a,int op){ up(i,0,(1<<n)-1)if(i<rev[i])swap(a[i],a[rev[i]]); for(int k=1;k<(1<<n);k<<=1){ for(int i=0;i<(1<<n);i+=k<<1) up(j,i,i+k-1){ int x=a[j],y=a[j+k]*1llu*mul[op][k+j-i]%p; a[j]=add(x,y),a[j+k]=add(x,p-y); } } if(op){int iv=qp(1<<n,p-2);up(i,0,(1<<n)-1)a[i]=a[i]*1llu*iv%p;} } } const int N=8192; int sm[5005][N],va[N],v2[N],c[N]; short f[5005][N]; int lb(int x){return x&(-x);} void ins(int x){ for(;x;x-=lb(x)) up(i,0,N-1)va[i]=va[i]*1llu*sm[x][i]%p,c[i]+=f[x][i]; } void del(int x){ for(;x;x-=lb(x)) up(i,0,N-1)v2[i]=v2[i]*1llu*sm[x][i]%p,c[i]-=f[x][i]; } int omega[N],iomega[N],ck[N],pre[N],ipre[N]; void getinv(){ up(i,0,N-1)if(!v2[i])ck[i]=v2[i]=1;else ck[i]=0; pre[0]=v2[0];up(i,1,N-1)pre[i]=pre[i-1]*1llu*v2[i]%p; ipre[N-1]=qp(pre[N-1],p-2);down(i,N-1,1)ipre[i-1]=ipre[i]*1llu*v2[i]%p; v2[0]=ipre[0];up(i,1,N-1)v2[i]=pre[i-1]*1llu*ipre[i]%p; up(i,0,N-1)if(ck[i])v2[i]=0; } void slv(){ n=read(),q=read();up(i,1,n)w[i]=read(); Poly::init();up(i,1,n)up(j,0,N-1)sm[i][j]=1; int W=qp(G,p-1>>13); omega[0]=1;up(i,1,N-1)omega[i]=omega[i-1]*1llu*W%p,iomega[i]=qp(omega[i]-1,p-2); while(q--){ int op=read(); if(op<=2){ int x=read(),v=read(); auto mul=[&](int a,int b){return (a*b)&(N-1);}; auto get=[&](int *v){ int a=w[x],b=cnt[x]; up(i,0,N-1)if(mul(i,a))v[i]=(omega[mul(mul(i,a),b+1)]-1)*1llu*iomega[mul(i,a)]%p;else v[i]=b+1; };get(v2),getinv();if(op&1)cnt[x]+=v;else cnt[x]-=v;get(va); up(i,0,N-1)c[i]=(!va[i])-(!v2[i]),va[i]=max(va[i],1)*1llu*max(v2[i],1)%p; for(;x<=n;x+=lb(x))up(i,0,N-1)sm[x][i]=sm[x][i]*1llu*va[i]%p,f[x][i]+=c[i]; }else{ int l=read(),r=read(),k=read(); up(i,0,N-1)va[i]=v2[i]=1,c[i]=0;ins(r),del(l-1); getinv();up(i,0,N-1)if(c[i])va[i]=0;else va[i]=va[i]*1llu*v2[i]%p; Poly::ntt(va,1); int res=p-1;up(i,0,k)res=add(res,va[i]); printf("%d\n",res); } } } int main(){ // freopen("biden.in","r",stdin),freopen("biden.out","w",stdout); slv(); return 0; }


测评信息: