mx A 求调
  • 板块学术版
  • 楼主_Fatalis_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/9 13:03
  • 上次更新2024/11/9 15:10:25
查看原帖
mx A 求调
414231
_Fatalis_楼主2024/11/9 13:03

https://www.luogu.com.cn/record/187556194 拜谢/kel

// Copyright 2024 Lotuses
#include <bits/stdc++.h>

template<typename T>
void read(T &r) { r = 0; static char ch, last; ch = getchar(), last = 'z'; while (ch < '0' || ch > '9') last = ch, ch = getchar(); while (ch >= '0' && ch <= '9') r = (r << 1) + (r << 3) + (ch ^ 48), ch = getchar(); r = (last == '-') ? -r : r; }
template<typename T, typename...Ts>
void read(T &arg, Ts&...arg_left) { read(arg); read(arg_left...); }

// #define int long long
typedef long long ll;
typedef unsigned long long ull;
typedef std::vector<int> vi;
typedef std::pair<int, int> pii;
#define sint static int

const int maxn = 2e5 + 10;
#define mod(x, y) (((x) - 1) % (y) + 1)

char ch[maxn << 1];
int n, q; ll m;
__int128 f[maxn << 1][62];
void init() {
    int mx = 1;
    ll mp = (m - 1) / n * n; m = mod(m, n);
    for (int i = m; i >= m - n; i--) {
        if (ch[i + n] == '1') { mx = i; break; }
    }
    for (int i = 1; i <= n; i++) {
        if (ch[i + m] == '1') mx = i + m;
        f[i][0] = std::max(i + 1ll, mx + mp) - i;
        // printf("%lld ", (ll) f[i][0]);
    } // puts("");
    for (int j = 1; j < 62; j++) {
        for (int i = 1; i <= n; i++) {
            f[i][j] = f[i][j - 1] + f[mod(i + f[i][j - 1], n)][j - 1];
        }
    }
}

const ll p = 1e9 + 7;

int main() {
    // freopen("kingdom5.in", "r", stdin);
    // freopen("kingdom.out", "w", stdout);
    
    read(n, m, q);
    scanf("%s", ch + 1);
    for (int i = 1; i <= n; i++) ch[i + n] = ch[i];
    init();
    while (q--) {
        ll s, k, u, ans; 
        read(s, k); u = mod(s, n); ans = 0;
        for (int i = 0; i < 62; i++) {
            if ((k >> i) & 1) {
                ans += f[u][i] % p; ans %= p;
                u = mod(u + f[u][i], n);
            }
        }
        printf("%lld\n", (ans + s) % p);
    }
    return 0;
}
2024/11/9 13:03
加载中...