70pts求调
查看原帖
70pts求调
425912
罗非鱼Requiem楼主2024/11/11 18:57
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <stack>
#include <queue>

#define nxt (a[i][j-1]+i)%n?(a[i][j-1]+i)%n:n

using namespace std;

typedef long long int64;

const int MAXN = 2 * 1e5 + 7;
const int INF = (1 << 30) - 1 + (1 << 30);
const int64 INF64 = (1ll << 62ll) - 1ll + (1ll << 62ll);
const int64 mod = 1e9 + 7;

int n, Q;
int pre[MAXN];
int64 m;
int64 a[MAXN][64];
char s[MAXN];

template<typename T_int>
void input(T_int &x) {
	char ch = getchar();
	T_int fu = 1; x = 0;
	while(!('0' <= ch && ch <= '9')) fu = ((ch == '-') ? -1 : fu), ch = getchar();
	while('0' <= ch && ch <= '9') x = x * 10 + (ch - '0'), ch = getchar();
	x *= fu;
}

int main() {
//	freopen("a.in", "r", stdin);
//	freopen("a.out", "w", stdout);

	input(n), input(m), input(Q);
	scanf("%s", s+1);
	
	for(int i=1; i<=n; i++) pre[i] = (s[i] == '1' ? i : pre[i-1]); //, printf("%d ", pre[i]);puts("");
	
	for(int i=1; i<=n; i++) {
		if(m + i <= 1ll * n) a[i][0] = (pre[i+m] == pre[i] ? 1 : pre[i+m] - i);
		else if(m + i <= 2ll * n) {
			int tmp = m + i - n;
//			printf("tmp = %d, ", tmp);
			if(pre[tmp]) a[i][0] = pre[tmp] + n - i;
			else a[i][0] = (pre[n] == pre[i] ? 1 : pre[n] - i);
		}
		else {
			int tmp = (m + i) % n;
			if(pre[tmp]) a[i][0] = (m - tmp + pre[tmp]) % mod;
			else a[i][0] = (!pre[n] ? 1 : m-(tmp+n-pre[n])) % mod;
		}
//		printf("a[%d][0] = %lld\n", i, a[i][0]);
	}
	
	for(int j=1; j<=61; j++) {
		for(int i=1; i<=n; i++) a[i][j] = (a[i][j-1] + a[nxt][j-1]) % mod;
	}
	
	while(Q--) {
		int64 IDX, k;
		input(IDX), input(k);
		
		int idx = IDX % n;
		idx = !idx ? n : idx;
		
		int64 cnt = 0ll, dis = 0ll;
		for(int64 j=61; j>=0; j--) {
			if(cnt + (1ll << j) > k) continue;
			cnt += (1ll << j);
//			printf("j = %lld, dis = %lld, a = %lld, cnt = %lld, idx = %d\n", j, dis, a[idx][j], cnt, idx);
			dis = (dis + a[idx][j]) % mod;
			idx = (idx + a[idx][j]) % n ? (idx + a[idx][j]) % n : n;
		}
		
		printf("%lld\n", (IDX % mod + dis) % mod);
	}
	
	return 0;
}
2024/11/11 18:57
加载中...