70 pts 求调
查看原帖
70 pts 求调
524369
netlify楼主2024/11/10 21:32

记录 代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+1,mod=1e9+7;
int n,m,q,lst[N],f[N][64],sum[N][64];
char c[N];
signed main(){
	cin>>n>>m>>q>>c+1;
	bool flag=1;
    for(int i=1;i<=n;i++){
    	lst[i]=(c[i]-'0'?i:lst[i-1]);
    	if(c[i]-'0')flag=0;
    }
    if(flag)
    	for(int s,k;q--;)
			cin>>s>>k,cout<<(s+k)%mod<<"\n";
    for(int i=1;i<=n;i++){
    	int mm=i+m,t=mm/n,c=mm%n;
		if(t==0){
			if(lst[c]<=i)f[i][0]=i+1,sum[i][0]=1;
			else f[i][0]=lst[c],sum[i][0]=lst[c]-i;
		}
		else f[i][0]=(lst[c]==0?n:lst[c]),sum[i][0]=((n*t)%mod+lst[c]%mod-i)%mod;
    }
	for(int k=1;k<=62;k++)
		for(int i=1;i<=n;i++)
			f[i][k]=f[f[i][k-1]][k-1],sum[i][k]=(sum[i][k-1]+sum[f[i][k-1]][k-1])%mod;
	for(int s,k;q--;){
		cin>>s>>k;
		int ans=s%mod;
		s=(s-1)%n+1;
		for(int i=62;i>=0;i--)
			if(k>=(1ll<<i))k-=(1ll<<i),ans=(ans+sum[s][i])%mod,s=f[s][i];
		cout<<ans<<"\n";
	}
	return 0;
}
2024/11/10 21:32
加载中...