倍增75pts求条
查看原帖
倍增75pts求条
982518
sjwhsss楼主2024/11/9 13:56
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e5+5 , mod = 1e9 + 7;
int n , q , nxt[maxn] , a[maxn] , dp[65][maxn] , lg[maxn];
ll m , f[maxn] , g[65][maxn];
string s;
void Init()
{
	for (int i = 1; i <= n; i++) dp[0][i]=nxt[i] , g[0][i]=f[i];
	for (int k = 1; k <= 63; k++)
	{
		for (int i = 1; i <= n; i++) dp[k][i]=dp[k-1][dp[k-1][i]] , g[k][i]=(g[k-1][i] + g[k-1][dp[k-1][i]])%mod;
	}
	return;
}
ll Query(ll s , ll b)
{
	s = (s - 1) % n + 1;
	ll tmp = b , ans = 0;
	for (int i = 63; i >= 0; i--)
	{
		if (tmp & (1ll<<i))(ans += g[i][s])%=mod , s = dp[i][s] , tmp^=1ll<<i;
	}
	return ans;
}
int main ()
{
//	freopen("in.txt" , "r" , stdin);
//	freopen("out.txt" , "w" , stdout);
	scanf("%d%lld%d" , &n , &m , &q);
	cin >> s;
	s = " " + s;
	for (int i = 1; i <= n; i++)
	{
		a[i]=a[i - 1];
		if (s[i]^48) a[i]=i;
	}
	for (ll i = 1; i <= n; i++)
	{
		if (i + m <= n)
		{
			if (a[i + m] > i)nxt[i]=a[i + m] , f[i]=a[i + m] - i;
			else nxt[i]=i+1 , f[i]=1;
		}
		else
		{
			if (a[(i + m - 1ll) % n + 1]) nxt[i]=a[(i + m - 1ll) % n + 1] , f[i]=a[(i + m - 1ll) % n + 1]-i+((m+i-1)/n)*n;
			else if (a[n] > i) nxt[i]=a[n] , f[i]=((m+i-1)/n)*n-i;
			else nxt[i]=i+1ll , f[i]=1ll;
		}
	}
	Init();
	while(q--)
	{
		ll s , k;
		scanf("%lld%lld" , &s , &k);
		printf("%lld\n" , (s + Query(s , k))%mod);
	}
	return 0;
}
2024/11/9 13:56
加载中...