#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cctype>
using namespace std;
#define int long long
int read(){
int s=0,w=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-1;
ch=getchar();
}
while(isdigit(ch)){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
const int mod=1e9+7;
int n,m,q,s,k;
string S;
int sum[500010];
__int128 nxt[500010][100];
int cnt0=1,cnt1=1;
int ask(int x){
return sum[x%n]+sum[n]*(x/n);
}
int query(int l,int r){
return ask(r)-ask(l-1);
}
int f(__int128 x){
return x%n==0?n:x%n;
}
signed main(){
cin>>n>>m>>q;
cin>>S;
S=" "+S+S;
for(int i=1;i<=n*2;i++){
sum[i]=sum[i-1]+(S[i]=='1');
}
for(int i=1;i<=n;i++){
int l=i+1,r=i+m;
while(l<r){
int mid=l+r>>1;
if(query(mid+1,i+m)>=1){
l=mid+1;
}
else{
r=mid;
}
}
if(query(l,l)>=1){
nxt[i][0]=l-i;
}
else{
nxt[i][0]=1;
}
}
for(int j=1;j<=62;j++){
for(int i=1;i<=n;i++){
nxt[i][j]=(nxt[i][j-1]+nxt[f(i+nxt[i][j-1])][j-1]);
}
}
while(q--){
cin>>s>>k;
int ans=s%mod;
for(int i=62;i>=0;i--){
if(k&(1ll<<i)){
s%=n;
if(s==0){
s=n;
}
ans=(ans+nxt[s][i]%mod)%mod;
s+=nxt[s][i]%n;
}
}
printf("%lld\n",ans);
}
return 0;
}
图片版:

#测试点信息
在这种情况下: #测试点信息
如果将代码中注释的地方去掉的话:测试点信息