Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34215 LYLAKIOIAKIOI 【S】T3 C++ 通过 100 1702 MS 291172 KB 2820 2024-11-03 20:49:41

Tests(25/25):


#include<bits/stdc++.h> #define gc getchar 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]; inline int read(){ int t=0,f=1;char ch=gc(); while(!(ch>='0'&&ch<='9')){ if(ch=='-') f=-1;ch=gc(); }while((ch>='0'&&ch<='9')) t=t*10+ch-'0',ch=gc(); return t*f; } int main(){ n=read(),q=read(),op=read(); 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++) l[i]=read(),r[i]=read(); }else{ int a1=read(),b1=read(),a2=read(),b2=read(); l[0]=read(),r[0]=read(); 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++) printf("%d\n",A[i]); }else{ int ans=0; for(int i=1;i<=q;i++) ans^=(A[i]+23*i); cout<<ans; } }


测评信息: