95pts tle !!
查看原帖
95pts tle !!
925491
pengze36楼主2024/11/22 22:00
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<map>
#define re register 
#define ll __int128 
using namespace std;
const ll mod=1e9+7;
ll  n,m;
long long nn,mm;
int q;
char s[200005];
ll sum[200005];
ll  f[200005][65];//62
ll calc(ll  x){
	return sum[x%n]+sum[n]*(x/n);
}
ll query(ll l,ll r){
	return calc(r)-calc(l-1); 
}
ll mo(ll x){
	if(x%n==0) return n;
	return x%n;
}
inline ll rd()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}

int main(){
	n=rd(),m=rd();
   scanf("%d%s",&q,s+1);
   for(int i=1;i<=n;++i){
   	sum[i]=sum[i-1]+(ll)(s[i]=='1');
   }
   for(int i=1;i<=n;++i){
   	ll  l=(ll)i+1,r=(ll)i+(ll)m,mid;
  	while(l<r){
   		mid=(l+r+1)>>1;
   		if(query(mid,i+(ll)m)>=1) l=mid;
   		else r=mid-1;
	   }
	if(query(l,l)>=1) f[i][0]=l-i;
    else f[i][0]=1;
   }
 //  cout<<"*"<<f[1][0]<<" "<<f[2][0]<<" "<<mo(1+f[1][0])<<" "<<f[1][1]<<endl;
   for(ll j=1;j<=62;++j){
   	for(ll i=1;i<=n;++i){
   		f[i][j]=f[i][j-1]+f[mo(i+f[i][j-1])][j-1];
   	//	cout<<i<<" "<<j<<" "<<f[i][j]<<" "<<f[i][j-1]<<" "<<f[mo(i+f[i][j-1])][j-1]<<endl;
	   }
   }
   while(q--){
   	ll s,k;
   	s=rd(),k=rd();
   	ll ans=s%mod;
   	for(ll i=0;i<62;++i){
   		if(k&((ll)1<<i)){
   			s%=n;
   			if(s==0) s=n;
   			ans=(ans+f[s][i])%mod;
   			s+=f[s][i];
   		//	cout<<"//"<<s<<endl;
		   }
	   }
	   printf("%lld\n",(long long )ans);
   }
	return 0;
} 
2024/11/22 22:00
加载中...