MnZn 倍增 90pts 求调
查看原帖
MnZn 倍增 90pts 求调
664908
lbdontknow楼主2024/11/9 19:53

WA on #14, RE on #15
玄关

#include<bits/stdc++.h>
using namespace std;
#define int long long 

#define DBG(x) DEBUG_print(#x, ':', x, '\n')
#define rep(i, a, b) for(int i = (a) ; i <= (b) ; i++)
#define per(i, a, b) for(int i = (b) ; i >= (a) ; i--)
#define MP make_pair
#define all(a) begin(a), end(a)
#define fi first
#define se second
typedef pair<int, int> P;

const int N = 2000000 + 10;
const int mod = 1e9 + 7;

int n, m, q;
string s;
int to[800000 + 5][100];
int step[800000 + 5][100];
int pre[800000 + 5];
P to_next(int idx){
    if(m < n){
        if(pre[idx + m] <= idx)
            return {idx % n + 1, 1};
        else
            return {(pre[idx + m] - 1) % n + 1, pre[idx + m] - idx};
    }
    else{
        int tmp = (m - n) / n % mod;
        int x = m % n;
        if(pre[idx + x] >= idx)
            return {(pre[idx + x] - 1) % n + 1, tmp * n % mod + pre[idx + x] + n - idx};
        if(pre[idx + x] == 0){
            if(pre[n] == 0)
                return {idx % n + 1, 1};
            return {pre[idx + x + n] - n, tmp * n % mod + pre[idx + x + n] - n - idx};
        }
        return {pre[idx + x], tmp * n % mod + pre[idx + x] - idx + n};
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin >> n >> m >> q;
    cin >> s;
    s = s + s;
    s = ' ' + s;
    for(int i = 1 ; i <= 2 * n ; i++){
        pre[i] = (s[i] == '1' ? i : pre[i - 1]);
    }
    rep(i, 1, n)
        to[i][0] = to_next(i).first, step[i][0] = to_next(i).second % mod;
    rep(k, 1, 62){
        rep(i, 1, n){
            to[i][k] = to[to[i][k - 1]][k - 1];
            step[i][k] = (step[i][k - 1] + step[to[i][k - 1]][k - 1]) % mod;
        }
    }
    while(q--){
        int s, k;
        cin >> s >> k;
        int previ = s % mod;
        s = (s - 1) % n + 1;
        int noww = s, ans = 0;
        per(l, 0, 62){
            if(k < (1ll << l))
                continue;
            k -= (1ll << l);
            ans += step[noww][l];
            ans %= mod;
            noww = to[noww][l];
        }
        cout << (ans + previ) % mod<< endl;
    }
    return 0;
}
2024/11/9 19:53
加载中...