1 条题解
-
1
#include<bits/stdc++.h> using namespace std; #define int long long #define lc(p) (p<<1) #define rc(p) ((p<<1)|1) #define MID ((l+r)>>1) #define N 500010 #define mod 998244353 struct node{ int l,r,a,b; int taga,tagb; int _taga,an; }tr[N<<2]; int n,q; int aa[N],bb[N]; //a2(a1x+b1)+b2=a1*a2*x+(b1*a2+b2) //fl(x):a1x+b1 //fr(x):a2x+b2 //a(a..(ax+b)..+b)+b=a^n*x+b*(1+a+a^2+a^3+..+a^(n-1))=a^n*x+b*(a^n-1)/(a-1) //S=1+a+a^2+..+a^(n-1) aS=a+a^2+a^3+..+a^n (a-1)S=a^n-1 S=(a^n-1)/(a-1) int qpow(int a,int b){ if(a==0)return 0; if(a==1)return 1; int res=1; for(;b;b>>=1,a=a*a%mod)if(b&1)res=res*a%mod; return res; } void pushup(int p){ tr[p].a=tr[rc(p)].a*tr[lc(p)].a%mod; tr[p].b=(tr[rc(p)].a*tr[lc(p)].b%mod+tr[rc(p)].b)%mod; } void pushdown(int p){ int &taga=tr[p].taga,&tagb=tr[p].tagb; if(taga){ int _taga=tr[p]._taga; tr[lc(p)].taga=tr[rc(p)].taga=taga; tr[lc(p)].tagb=tr[rc(p)].tagb=tagb; tr[lc(p)]._taga=tr[rc(p)]._taga=_taga; int nn=tr[lc(p)].r-tr[lc(p)].l+1; int an=qpow(taga,nn); tr[lc(p)].a=an; if(taga==1)tr[lc(p)].b=nn*tagb%mod; else tr[lc(p)].b=(an-1)*_taga%mod*tagb%mod; nn=tr[rc(p)].r-tr[rc(p)].l+1; an=qpow(taga,nn); tr[rc(p)].a=an; if(taga==1)tr[rc(p)].b=nn*tagb%mod; else tr[rc(p)].b=(an-1)*_taga%mod*tagb%mod; taga=0; } } void build(int p,int l,int r){ if(l==r){ tr[p]={l,r,aa[l],bb[l],0,-1,0,0}; return; } tr[p]={l,r,0,0,0,-1,0,0}; build(lc(p),l,MID);build(rc(p),MID+1,r); pushup(p); } void change(int p,int l,int r,int a,int b,int _taga){ if(tr[p].r<l||r<tr[p].l)return; if(l<=tr[p].l&&tr[p].r<=r){ tr[p].taga=a,tr[p].tagb=b; tr[p]._taga=_taga; int nn=tr[p].r-tr[p].l+1; int an=qpow(a,nn); tr[p].a=an; if(a==1)tr[p].b=nn*b%mod; else tr[p].b=(an-1)*_taga%mod*b%mod; return; } pushdown(p); change(lc(p),l,r,a,b,_taga);change(rc(p),l,r,a,b,_taga); pushup(p); } int query(int p,int l,int r,int x){ if(l<=tr[p].l&&tr[p].r<=r)return (tr[p].a*x%mod+tr[p].b)%mod; pushdown(p); int mid=(tr[p].l+tr[p].r)>>1; if(l<=mid)x=query(lc(p),l,r,x)%mod; if(r>mid)x=query(rc(p),l,r,x)%mod; return x; } signed main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>q; for(int i=1;i<=n;i++)cin>>aa[i]>>bb[i]; build(1,1,n); while(q--){ int op;cin>>op; if(op==0){ int l,r,c,d;cin>>l>>r>>c>>d;l++; change(1,l,r,c,d,qpow(c-1,mod-2)); } else{ int l,r,x;cin>>l>>r>>x;l++; cout<<query(1,l,r,x)<<'\n'; } } return 0; }
- 1
信息
- ID
- 8132
- 时间
- 5000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 58
- 已通过
- 6
- 上传者