【悬关】倍增 WA45pts求调
查看原帖
【悬关】倍增 WA45pts求调
349824
WsW_花逝爆零人楼主2025/1/19 20:13
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
const int p=1e9+7;
int n,m,q;
string s;
int to[63][400003];
int st[63][400003];
int last[400003];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>q>>s;
	s+=s;
	for(int i=1;i<s.length();i++)last[i]=(s[i]=='1'?i:last[i-1]);
	for(int i=0;i<s.length();i++){
		int t=min(i+m,(int)s.length());
		if(last[t]==-1||last[t]<=i)st[i][0]=1;
		else st[i][0]=last[t]-i;
		if(i>=n&&st[i-n][0]==1)st[i-n][0]=st[i][0];
	}
	for(int t=1;t<=60;t++){
		for(int i=0;i<s.length();i++){
			st[i][t]=(st[i][t-1]+st[(i+st[i][t-1])%n][t-1])%p;
		}
	}
	while(q--){
		ll s,k;cin>>s>>k;
		s--;
		ll ans=s%p;
		int now=s%n;
		for(int t=60;t>=0;t--){
			if(((k>>t)&1)==0)continue;
			(ans+=st[now][t])%=p;
			(now+=st[now][t])%=n;
		}
		cout<<(ans+1)%p<<'\n';
	}
	
	return 0;
}
2025/1/19 20:13
加载中...