60 pts求大佬调教
查看原帖
60 pts求大佬调教
637220
wooaoo楼主2024/11/9 16:44
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
ll n,m,q,x,k,nxt[200005][70],vis[200005],add[200005][70];
string s;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	//freopen("kingdom4.in","r",stdin);
	//freopen("kingdom.out","w",stdout);
	cin>>n>>m>>q>>s;
	
	//case:all 0
	for(int i=0;i<n;i++)
	{
		if(s[i]!='0')goto work;
	}
	while(q--)
	{
		cin>>x>>k;
		k%=mod;
		cout<<(x+k)%mod<<'\n';
	}
	return 0;
	/////////////////////
	work:;
	for(int i=0;i<n;i++)nxt[i][0]=(i+1)%n;
	
	if(m<n)
	{
		ll ans=1;
		for(int i=m;i>=1;i--)
		{
			if(s[i]=='1')
			{
				ans=i;
				break;
			}
		}
		for(int i=0;i<n;i++)
		{
			ll end=(i+m)%n;
			if(s[end]=='1')ans=end;
			if(ans==i)ans=(i+1)%n;
			nxt[i][0]=ans;
			if(ans<=i)add[i][0]=1;
		}
	}
	else
	{
		ll ans=1;
		ll IAKIOI;
		for(int i=m%n;i>=0;i--)
		{
			if(s[i]=='1')
			{
				ans=i;
				IAKIOI=m/n;
				goto abc;
			}
		}
		for(int i=n-1;i>=0;i--)
		{
			if(s[i]=='1')
			{
				ans=i;
				IAKIOI=m/n-1;
				break;
			}
		}
		abc:;
		for(int i=0;i<n;i++)
		{
			ll end=(i+m)%n;
			if(s[end]=='1')vis[end]=1,ans=end;
			
			if(ans==i)
			{
				if(vis[end]==1)ans=i%n;
				
				else vis[ans]=0,ans=(i+1)%n;
			}
			
			nxt[i][0]=ans;
			add[i][0]=IAKIOI;
			if(ans<=i)add[i][0]++;
		}
	}
	//cout<<"K";
	for(ll j=1;j<=62;j++)
	{
		for(ll i=0;i<n;i++)
		{
			nxt[i][j]=nxt[nxt[i][j-1]][j-1];
			add[i][j]=(add[i][j-1]+add[nxt[i][j-1]][j-1])%mod;
		}
	}
	//cout<<"K";
	/*for(int i=0;i<n;i++)
	cout<<add[i][3]<<'|';*/
	while(q--)
	{
		cin>>x>>k;
		ll cur=x-1ll,p=0;
		if(cur>n)
		{
			p+=cur/n;
			cur=cur%n;
		}
		for(ll j=62;j>=0;j--)
		{
			if((1ll<<j)<=k)
			{
				//cout<<j<<' '<<add[cur][j]<<endl;
				p=(p+add[cur][j])%mod;
				cur=nxt[cur][j];
				k-=(1ll<<j);
			}
			if(k<=0)break;
		}
		//cout<<cur<<"|"<<p<<endl;
		cout<<(cur+1ll+(p*n)%mod)%mod<<'\n';
	}
	return 0;
}
2024/11/9 16:44
加载中...