求调,悬 2 关
  • 板块灌水区
  • 楼主MournInk
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/9 13:10
  • 上次更新2024/11/9 15:17:01
查看原帖
求调,悬 2 关
346232
MournInk楼主2024/11/9 13:10

【MX-S5-T1】王国边缘

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define sint __int128
#define double long double
const int mod = 1e9 + 7;
const int len = 2e5 + 10;
int n, m, q, s, k;
string str;
sint ne[len][64];
signed main()
{
    auto mode = [&](sint num, int _mod = mod) { return (num - 1) % _mod + 1; };
    auto init = [&]() {
        string temp = " " + str + str + str;
        int rate = m / n, dist = m % n, last = -1;
        rate *= n;
        if(dist == 0 && rate)
            rate -= n, dist += n;
        for(int i = 2; i <= dist + 1; i ++)
            last = (temp[i] == '1' ? i : last);
        for(int i = 1; i <= n; i ++)
            ne[i][0] = (last + rate <= i ? 1 : last + rate - i),
            last = (temp[i + dist + 1] == '1' ? i + dist + 1 : last);
        for(int j = 1; j < 64; j ++)
            for(int i = 1; i <= n; i ++)
                ne[i][j] = (ne[i][j - 1] + ne[mode(ne[i][j - 1] + i, n)][j - 1]);
    };
    ios :: sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> n >> m >> q >> str;
    init();
    while(q --)
    {
        cin >> s >> k;
        sint _s = s;
        int l = 0;
        while((1ull << l) <= k) l ++;
        l --;
        while(l >= 0)
        {
            if((1ull << l) & k)
                _s += ne[mode(_s, n)][l];
            l --;
        }
        cout << (long long)(_s % mod) << endl;
    }
    return 0;
}
2024/11/9 13:10
加载中...