Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
40460 LYLAKIOI 【BJ】T1 C++ 通过 100 1379 MS 160636 KB 3032 2026-03-05 20:47:39

Tests(66/66):


#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; } const int N=8192; int sm[5005][N],va[N],v2[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; } void del(int x){ for(;x;x-=lb(x)) up(i,0,N-1)v2[i]=v2[i]*1llu*sm[x][i]%p; } int omega[N],iomega[N],ck[N],pre[N],ipre[N],omega2[N],iomega2[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; } int mask[5005]; int g(int x){return __lg(x&(-x));} void bd(int x){ int L=13-g(w[x])-g(cnt[x]+1),R=12-g(w[x]); mask[x]=0;up(i,L,R)mask[x]|=1<<i; } void slv(){ n=read(),q=read();up(i,1,n)w[i]=read(); up(i,1,n)up(j,0,N-1)sm[i][j]=1; int W=qp(G,p-1>>13),W2=qp(Gi,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); omega2[0]=1;up(i,1,N-1)omega2[i]=omega2[i-1]*1llu*W2%p,iomega2[i]=qp(omega2[i]-1,p-2); up(i,1,n)bd(i); while(q--){ int op=read(); auto mul=[&](int a,int b){return (a*b)&(N-1);}; if(op<=2){ int x=read(),v=read(); 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)va[i]=max(va[i],1)*1llu*max(v2[i],1)%p; bd(x);for(;x<=n;x+=lb(x))up(i,0,N-1)sm[x][i]=sm[x][i]*1llu*va[i]%p; }else{ int l=read(),r=read(),k=read(),S=0;up(i,l,r)S|=mask[i]; up(i,0,N-1)va[i]=v2[i]=1;ins(r),del(l-1); getinv();up(i,0,N-1)if(S&(i&(-i)))va[i]=0;else va[i]=va[i]*1llu*v2[i]%p; int res=va[0]*1llu*(k+1)%p;up(i,1,N-1)res=(res+va[i]*1llu*(omega2[mul(i,k+1)]-1)%p*iomega2[i])%p; res=res*1llu*qp(N,p-2)%p;res=add(res,p-1); printf("%d\n",res); } } } int main(){ // freopen("biden.in","r",stdin),freopen("biden.out","w",stdout); slv(); return 0; }


测评信息: