Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34212 | LYLAKIOIAKIOI | 【S】T3 | C++ | 运行超时 | 80 | 5315 MS | 291176 KB | 2565 | 2024-11-03 20:46:37 |
#include<bits/stdc++.h> using namespace std; const int N=5e6+10,Q=5e6+10,mod=1e9+7; int l[Q],r[Q]; int A[Q];int op; int s[N];int n,q; int f[N];int hf=5e8+4; int s0[N],s1[N],sh0[N],sh1[N]; int g[N];int sp2[N],sp2i[N],p2[N],pf2[N]; int main(){ cin>>n>>q>>op; string S;cin>>S;S=' '+S; for(int i=1;i<=n;i++) s[i]=S[i]-'0'; p2[0]=1;for(int i=1;i<=n;i++) p2[i]=p2[i-1]*2%mod; pf2[0]=1;for(int i=1;i<=n;i++) pf2[i]=1ll*pf2[i-1]*hf%mod; for(int i=1;i<n;i++) if(s[i]==s[i+1]) g[i]=1; for(int i=1;i<=n;i++) g[i]+=g[i-1];sp2[0]=1;sp2i[0]=0; for(int i=1;i<=n;i++) sp2[i]=(p2[i]+sp2[i-1])%mod,sp2i[i]=(1ll*i*p2[i]+sp2i[i-1])%mod; for(int i=1;i<=n;i++){ sh0[i]=sh0[i-1];sh1[i]=sh1[i-1]; s0[i]=s0[i-1];s1[i]=s1[i-1]; if(s[i]==0){ s0[i]=(s0[i]+p2[i])%mod; sh0[i]=(sh0[i]+pf2[i])%mod; }else{ s1[i]=(s1[i]+p2[i])%mod; sh1[i]=(sh1[i]+pf2[i])%mod; }//cout<<sp2i[i]<<' '; }for(int i=1;i<=n;i++){ f[i]=f[i-1]; if(s[i]==0){ f[i]=(f[i]+1ll*pf2[i]*s0[i-1])%mod; }else{ f[i]=(f[i]+1ll*pf2[i]*s1[i-1])%mod; } }//return 0; if(op==0){ for(int i=1;i<=q;i++) cin>>l[i]>>r[i]; }else{ int a1,a2,b1,b2;cin>>a1>>b1>>a2>>b2; cin>>l[0]>>r[0]; for(int i=1;i<=q;i++){ l[i]=(1ll*a1*l[i-1]+b1)%n+1; r[i]=(1ll*a2*r[i-1]+b2)%n+1; if(l[i]>r[i]) swap(l[i],r[i]); } } for(int i=1;i<=q;i++){ int ans=0; int dlt=0,drt=0;int len=r[i]-l[i]+1; drt=(g[r[i]-1]-g[l[i]-1]); //cout<<drt<<' '; if(len>=3){ //cout<<1ll*(mod-1)*hf%mod*hf%mod*(sp2i[len-1]+mod-sp2i[1])%mod<<' '; drt=(1ll*drt+1ll*len*sp2[len-3]%mod+1ll*(mod-1)*hf%mod*hf%mod*(sp2i[len-1]+mod-sp2i[1])%mod)%mod; } dlt=f[r[i]]-f[l[i]-1]+mod;dlt%=mod; //cout<<dlt<<' '; dlt=(dlt+mod- 1ll*( 1ll*s0[l[i]-1]*(sh0[r[i]]-sh0[l[i]-1]+mod)%mod +1ll*s1[l[i]-1]*(sh1[r[i]]-sh1[l[i]-1]+mod)%mod )%mod )%mod; //cout<<dlt<<' '; dlt=1ll*dlt*p2[r[i]-l[i]]%mod; //cout<<dlt<<' '<<drt<<' '; ans=(dlt+drt)%mod; //cout<<ans<<endl; ans=1ll*ans*hf%mod; A[i]=ans; }if(op==0){ for(int i=1;i<=q;i++) cout<<A[i]<<endl; }else{ int ans=0; for(int i=1;i<=q;i++) ans^=(A[i]+23*i); cout<<ans; } }