55pts求调
查看原帖
55pts求调
635829
D_FANG楼主2024/11/11 18:02
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1e4;
const long long mod=1e9+7;
long long n,m,q;
char a[N];
long long dp[61][N],xb[61][N];
long long pre[N];
void ycl(){
	for (int i=1,l=-1;i<=n;++i){
		if (a[i]=='1') l=i;
		pre[i]=l;
	}
	pre[0]=-1;
	for (int i=1;i<=n;++i){
		int x=(m+i)%n;
		if (pre[x]==-1){
			if (m+i<n) dp[0][i]=i+1;
			else if (m+i<=2*n&&pre[n]<=i) dp[0][i]=1; 
			else dp[0][i]=pre[n]+((m+i)/n)*n-n-i;
		}
		else{
			if (m+i<=n&&pre[x]<=i){
				dp[0][i]=1;
			}
			else dp[0][i]=pre[x]+((m+i)/n)*n-i;
		}
		xb[0][i]=(dp[0][i]+i)%n;
		if (xb[0][i]==0) xb[0][i]=n;
		dp[0][i]%=mod;
	}
/*	for (int i=1;i<=n;++i){
		printf("#%d dp=%lld\n",i,dp[0][i]);
	}
	printf("\n");
*/
	for (int i=1;i<=60;++i){
		for (long long j=1;j<=n;++j){
			dp[i][j]=(dp[i-1][j]+dp[i-1][xb[i-1][j]])%mod;
			xb[i][j]=xb[i-1][xb[i-1][j]];
		}
	}
/*	for (int i=1;i<=n;++i){
		printf("#%d dp=%lld\n",i,dp[1][i]);
	}*/
} 
long long s,k,sum,len,cnt;
void check(){
	for (int i=1;i<=n;++i){
		if (a[i]=='1') return ;
	}
	scanf("%d",&q);
	for (int i=1;i<=q;++i){
		scanf("%lld%lld",&s,&k);
		printf("%lld\n",(s%mod+k%mod)%mod);
	}
	exit(0);
}
void work(){
	for (int i=1;i<=q;++i){
		scanf("%lld%lld",&s,&k);
		sum=s;
		s%=n;
		if (s==0) s=n;
		len=0;cnt=1;
		while (cnt<=k){
			++len;
			cnt*=2;
		}
		--len;
		cnt/=2;
	//	printf("sum=%lld\n",sum);
		while (k>0){
//			printf("k=%lld len=%lld\n",k,len);
			if (k>=cnt){
				sum=(sum+dp[len][s])%mod;
				s=sum%n;
				if (s==0) s=n;
				k-=cnt;
			}
			--len;
			cnt/=2;
		}
		printf("%lld\n",sum);
	}	
}
int main(){
//	freopen("kingdom5.in","r",stdin);
//	freopen("2.out","w",stdout);
	scanf("%lld%lld%lld",&n,&m,&q);
	scanf("%s",a);
	for (int i=n;i>=1;--i){
		a[i]=a[i-1];
	}
	check();
	ycl();
	work();
	return 0;
} 
2024/11/11 18:02
加载中...