25pts RE玄关求调
查看原帖
25pts RE玄关求调
929151
xxr___楼主2024/11/9 16:55

记录:https://www.luogu.com.cn/record/187634608

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define up(i,l,r) for(int i=l;i<=r;++i)
#define dn(i,l,r) for(int i=l;i>=r;--i)
const int mod=1e9+7;
const int N=2e5+5;
int n,m,q,nxt[N][62],lst[N];
char c[N];

int32_t main(){
	//freopen("kingdom2.in","r",stdin); 
//	freopen("my.txt","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m>>q;
	up(i,1,n) cin>>c[i];
	up(i,1,n) lst[i]=(c[i]=='1'?i:lst[i-1]);
	up(i,1,n){
		int res=n-i;
		if(m<=res){
			nxt[i][0]=max((int)1,lst[i+m]-i);
		}else{
			int k=m-res;
			int t=k/n;
			if(!t){
				if(lst[k]){
					nxt[i][0]=lst[k]+res;nxt[i][0]=max(nxt[i][0],(int)1); 
				}else{
					nxt[i][0]=max((int)1,lst[n]-i);
				}
			}else{
				int pmod=k%n;
				if(lst[pmod]){
					nxt[i][0]=lst[pmod]+res+t*n;nxt[i][0]=max(nxt[i][0],(int)1);
				}else{
					nxt[i][0]=max(nxt[i][0],max((int)1,lst[n]+(t-1)*n+res));
				}
			}
		}
	}
	up(j,1,60){
		up(i,1,n){
			nxt[i][j]=nxt[i][j-1];
			if((i+nxt[i][j-1])%n==0){
				nxt[i][j]=nxt[i][j]+nxt[n][j-1];
			}else{
				nxt[i][j]=nxt[i][j]+nxt[(i+nxt[i][j-1])%n][j-1];
			}
		}
	}
	while(q--){
		int s,k;
		cin>>s>>k;
		int ans=0,now=s;
		if(s%n==0) s=n;
		else s%=n;
		dn(i,60,0){
			if(k>>i&1){
				ans=(ans+nxt[s][i])%mod;
				s=s+nxt[s][i];
				if(s%n==0) s=n;
				else s=s%n; 
			}
		}
		cout<<(ans+now)%mod<<'\n'; 
	} 
	return 0;
}
//tomxi
2024/11/9 16:55
加载中...