标程-【MX-S5-T1】王国边缘

https://htoj.com.cn/cpp/oj/problem/detail?pid=22185117033728&tid=22487079604096&gid=22487067878400

#include <bits/stdc++.h>
#define ll long long
#define P 1000000007
using namespace std;
const int N = 200005;
int n, f[N][61], g[N][61], q;
ll dis[N], s, m, k;
char c[N];
int main(){
    cin >> n >> m >> q;
    cin >> c;
    int tmp = -1;
    for (int i =0; i < n; ++i)
        if (c[i] == '1') tmp = i;
    for (int i = n; i < 2 * n; ++i){
        if (c[i - n] == '1') tmp=i;
        if (tmp == -1) dis[i - n]= 0x3f3f3f3f3f3f3f3f;
        else dis[i - n] = i - tmp;
    }
    for (int i = 0; i < n; ++i){
        tmp=(i+m)%n;
        g[i][0]=max(m-dis[tmp],1ll)%P;
        f[i][0]=(i+max(m- dis[tmp],1ll))%n;
    }
    for (int j=1;j <= 60;++j)
        for (int i = 0; i < n; ++i){
            f[i][j] = f[f[i][j - 1]][j - 1];
            g[i][j] = (g[i][j - 1]+g[f[i][j - 1]][j -1]) % P;
        }
    while (q -- ){
        cin >> s >> k;
        ll ans = s % P;
        s=(s-1)%n;
        for(int j=0;j <= 60;++j)
            if ((k >> j) & 1){
                ans=(ans+g[s][j])% P;
                s=f[s][j];
            }
        cout << ans << "\n";
    }
}
posted @ 2025-12-06 19:43  LW_S  阅读(3)  评论(0)    收藏  举报