Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34236 | liuyile | 【S】T3 | C++ | 通过 | 100 | 1699 MS | 474600 KB | 2018 | 2024-11-03 21:18:39 |
#include<bits/stdc++.h> using namespace std; #define int long long #define endl "\n" #define pii pair<int,ll> #define p1(x) x.first #define p2(x) x.second int n,q,opt; const int M=1e9+7,iv2=5e8+4; int pw[5003000],pwi[5003000]; int prd[2][5003000],prdi[2][5000300]; bool p[5003000]; int s[5000300]; int seq[5000300]; int spw[5000300],sspw[5000300]; inline int S(int *f,int l,int r){ return (f[r]-f[l-1]+M)%M; } inline int calc(int l,int r){ if(l==r)return 0; int res=(S(s,l,r)-S(prdi[0],l,r)*S(prd[0],1,l-1)%M-S(prdi[1],l,r)*S(prd[1],1,l-1)%M+2*M)%M; res=res*pw[r-l]%M; // cout<<S(s,l,r)*pw[r-l-1]%M<<" "<<res<<endl; int len=r-l; res=(res+S(seq,l,r-1)+spw[r-l-2]*(r-l-1)%M-sspw[r-l-2]+M)%M; return res*iv2%M; } int al,bl,ar,br,l,r; signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("genshin.in","r",stdin); // freopen("genshin.out","w",stdout); cin>>n>>q>>opt; pw[0]=pwi[0]=1; for(int i=1;i<=n;i++) pw[i]=pw[i-1]*2%M,pwi[i]=pwi[i-1]*iv2%M; for(int i=1;i<=n;i++){ char x; cin>>x; p[i]=x-'0'; } for(int i=1;i<n;i++) seq[i]=seq[i-1]+(p[i]==p[i+1]); spw[0]=1,sspw[0]=0; for(int i=1;i<=n;i++) spw[i]=(spw[i-1]+pw[i])%M, sspw[i]=(sspw[i-1]+i*pw[i])%M; for(int i=1;i<=n;i++){ if(p[i])prd[1][i]=pw[i],prdi[1][i]=pwi[i],s[i]=(s[i-1]+pwi[i]*prd[1][i-1])%M; else prd[0][i]=pw[i],prdi[0][i]=pwi[i],s[i]=(s[i-1]+pwi[i]*prd[0][i-1])%M; for(int j=0;j<=1;j++) prd[j][i]=(prd[j][i]+prd[j][i-1])%M, prdi[j][i]=(prdi[j][i]+prdi[j][i-1])%M; } if(opt)cin>>al>>bl>>ar>>br>>l>>r; int res=0; for(int i=1;i<=q;i++){ if(!opt)cin>>l>>r; else l=(l*al+bl)%n+1,r=(r*ar+br)%n+1; if(l>r)swap(l,r); if(opt)res^=(calc(l,r)+i*23); else cout<<calc(l,r)<<endl; }if(opt)cout<<res<<endl; cout.flush(); return 0; }