社区讨论
90 pts WA on #14 #15求条
P11267【MX-S5-T1】王国边缘参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m3mmbqru
- 此快照首次捕获于
- 2024/11/18 14:01 去年
- 此快照最后确认于
- 2025/11/04 14:29 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// 取模之前要减去1,以防模为0
ll f[80][400010];
ll g[80][400010];
ll a[400010];
ll n, m, q;
char c[300010];
const ll mod = 1e9 + 7;
int t, last;
int main() {
// freopen("kingdom5.in", "r", stdin);
// freopen("kingdom5.out", "w", stdout);
scanf("%lld%lld%lld", &n, &m, &q);
scanf("%s", c + 1);
// puts("R");
bool flag = false;
for (int i = 1; i <= n; i++)
if (c[i] == '1')
last = i, flag = true;
for (int i = 1; i <= n; i++) {
if (c[i] == '1')
last = i;
a[i] = last;
}
if (flag) {
for (int i = 1; i <= n; i++) {
if (i + m <= n) {
if (a[i + m] > i) {
f[0][i] = a[i + m];
g[0][i] = a[i + m] - i;
} else {
f[0][i] = i % n + 1;
g[0][i] = 1;
}
} else {
ll x = (i + m - 1) % n + 1;
if (m >= n) {
f[0][i] = a[x];
ll temp = (i + m - 1) / n; //所在位置的循环节
g[0][i] = f[0][i] - i + temp * n;
} else {
ll s = a[x];
if (s > i || s <= x) {
f[0][i] = a[x];
if (s > i)
g[0][i] = f[0][i] - i;
else
g[0][i] = f[0][i] + n - i;
} else {
f[0][i] = i % n + 1;
g[0][i] = 1;
}
}
}
}
} else {
// puts("R");
for (int i = 1; i <= n; i++) {
f[0][i] = (i - 1) % n + 1;
g[0][i] = 1;
}
}
for (int i = 1; i <= 62; i++) {
for (int j = 1; j <= n; j++) {
f[i][j] = f[i - 1][f[i - 1][j]];
g[i][j] = (g[i - 1][j] + g[i - 1][f[i - 1][j]]) % mod;
}
}
while (q--) {
ll x, y;
scanf("%lld%lld", &x, &y);
ll ans = 0;
t = x % mod;
if (y == 0) {
ans = x;
printf("%lld\n", ans % mod);
} else {
x = (x - 1) % n + 1; //在每组里的相对位置
for (int i = 62; i >= 0; i--) {
if (y & (1ll << i)) {
ans = (ans + g[i][x]) % mod;
x = f[i][x];
y ^= (1ll << i);
}
}
printf("%lld\n", (ans % mod + t) % mod);
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...