wa 70pts 倍增求调
查看原帖
wa 70pts 倍增求调
676839
wangzeqin2008清风楼主2024/11/9 13:28
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

ll read() {
	ll n=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9') {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9') {
		n=(n<<1)+(n<<3)+ch-'0';
		ch=getchar();
	}
	return f==1?n:-n;
}

void write(ll x) {
	if(x<0) {
		putchar('-');
		x=-x;
	}
	if(x>9) write(x/10);
	putchar((x%10)+'0');
}

const int N=2e5+7,K=63;
const ll MOD=1e9+7;

int n,q;
ll m;
char str[N<<2];

void input() {
	n=read(),m=read(),q=read();
	scanf("%s",str+1);
}

ll f[N][K];
//f[i]¾­¹ý2^k´ÎÒÆ¶¯,ÍùºóÒÆ¶¯f[i][k]¸öµ¥Î»,1<=i<=n,f[i][k]ÕæÊµÖµ 
ll p2[K];
//p2[i]:2^i

void init() {
	//f[i][0]
	if(m<n) {
		//m<n
		ll last=0;
		for(int i=2;i<=m;i++) 
			if(str[i]=='1') 
				last=i;
		for(int i=1;i<=n;i++) {
			if(str[i+m]=='1') last=i+m;
			if(last>=i+1 && last<=m+i)
				f[i][0]=last-i;
			else
				f[i][0]=1;
		}
	}else{
		//m>=n
		bool one=0;
		for(int i=1;i<=n;i++) 
			if(str[i]=='1') {
				one=1;
				break;
			}
		if(!one) {
			for(int i=1;i<=n;i++) 
				f[i][0]=1;
		}else{
			//have '1'
			ll r=m%n;
			ll p=(m-r)/n;
			ll last=0;
			for(int i=1;i<=n;i++) 
				if(str[i+1]=='1') 
					last=1+(p-1)*n+i;
			for(int i=1;i<r;i++) 
				if(str[i+1]=='1') 
					last=1+p*n+i;
			for(int i=1;i<=n;i++) {
				if(str[i+r]=='1') last=i+p*n+r;
				if(last>=i+1 && last<=m+i) 
					f[i][0]=last-i;
				else
					f[i][0]=1;
			}
		}
	}
	for(int i=1;i<=n;i++) 
		f[i][0]%=MOD;
	for(int k=1;k<K;k++) {
		for(int i=1;i<=n;i++) {
			ll p=(i+f[i][k-1]-1)%n+1;
			f[i][k]=(f[i][k-1]+f[p][k-1])%MOD;
		}
	}
	p2[0]=1;
	for(int i=1;i<K;i++) 
		p2[i]=p2[i-1]<<1;
}

void work() {
	for(int i=1;i<=n;i++) 
		str[i+2*n]=str[i+n]=str[i];
	init();
	while(q--) {
		ll s,k;
		s=read(),k=read();
		ll st=(s-1)%n+1;
		ll dis=s-st;
		ll ans=st;
		for(int t=K-1;t>=0;t--) {
			if(k>=p2[t]) {
				ans=(ans+f[st][t])%MOD;
				st=(st+f[st][t]-1)%n+1;
				k-=p2[t];
			}
		}
		ans=(ans+dis)%MOD;
		write(ans),putchar('\n');
	}
}

int main() {
	input();
	work();
	return 0;
}
2024/11/9 13:28
加载中...