Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34192 | baka24 | 【S】T3 | C++ | 解答错误 | 4 | 1827 MS | 395788 KB | 2548 | 2024-11-03 18:59:12 |
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define x1 x114514 #define y1 y114514 #define x0 x1919810 #define y0 y1919810 int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=5000010,N=20,inf=2000000000,Mod=1000000007; int n,m,opt,L,R,ans,a[MAXN],d[MAXN],p2[MAXN],q2[MAXN],p[MAXN][2],q[MAXN][2],f[MAXN],g[MAXN]; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod;y>>=1;}return rt;} char s[MAXN]; void add(int &x,int y){x+=y;if(x>Mod)x-=Mod;} int x0,x1,y0,y1; int qry(int l,int r,bool x){ // cout<<l<<" "<<r<<" "<<x<<" "<< // (((!x)?f[r]-f[l-1]:g[r]-g[l-1])+Mod)%Mod // <<" "<< // q[l-1][1]*(p[r][1^x]-p[l-1][1^x]+Mod)%Mod+Mod // <<" "<< // q[l-1][0]*(p[r][x]-p[l-1][x]+Mod)%Mod+Mod // <<endl; return ( (((!x)?f[r]-f[l-1]:g[r]-g[l-1])+Mod)%Mod -q[l-1][1]*(p[r][1^x]-p[l-1][1^x]+Mod)%Mod+Mod -q[l-1][0]*(p[r][x]-p[l-1][x]+Mod)%Mod+Mod )%Mod; } int qry1(int l,int r){ return p2[r-l]*Pow(qry(l,r,0),Mod-2)%Mod; } int qry2(int l,int r){ return ( ( (qry(l,r,0))%Mod*q2[2]%Mod+ (r-l+1-(d[r]-d[l]))*q2[1]%Mod )%Mod +( (qry(l,r,1))%Mod*q2[2]%Mod+ (d[r]-d[l])*q2[1]%Mod )%Mod )%Mod; } void slv(){ n=read(),m=read(),opt=read(); scanf("%s",s+1); p2[0]=q2[0]=1,q2[1]=Pow(2,Mod-2); for(int i=1;i<=n;i++)a[i]=s[i]-'0',d[i]=d[i-1]+(a[i]^a[i-1]),p2[i]=p2[i-1]*2%Mod,q2[i]=q2[i-1]*q2[1]%Mod; for(int i=1;i<=n;i++) p[i][0]=p[i-1][0],p[i][1]=p[i-1][1],q[i][0]=q[i-1][0],q[i][1]=q[i-1][1], add(p[i][a[i]],p2[i]),add(q[i][a[i]],q2[i]); for(int i=1;i<=n;i++)f[i]=(f[i-1]+p2[i]*q[i-1][a[i]]%Mod)%Mod, g[i]=(g[i-1]+p2[i]*q[i-1][a[i]^1]%Mod)%Mod ; // for(int i=1;i<=n;i++) // cout<<p[i][0]<<" "<<p[i][1]<<" "<<q[i][0]<<" "<<q[i][1]<<" "<<f[i]<<" "<<g[i]<<endl; if(opt)x0=read(),x1=read(),y0=read(),y1=read(),L=read(),R=read(); for(int i=1;i<=m;i++){ if(opt)L=(L*x0+x1)%n+1,R=(R*y0+y1)%n+1; else L=read(),R=read(); int tmp=qry1(L,R);//+qry2(L,R); if(!opt)printf("%lld\n",tmp); else ans^=tmp+i*23; } if(opt)printf("%lld\n",ans); } signed main(){ slv(); return 0; }