95分求条
查看原帖
95分求条
766112
Y__dream楼主2024/11/9 14:37
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace FastIO {
	char buf[1 << 21], *p1 = buf, *p2 = buf;
// #define getchar() (p1 == p2 && (p1 == (p2 = ((p1 = buf) + fread(buf, 1, 1 << 21, stdin))))? EOF : *p1++)
	template <typename T> inline T read() { T x = 0, w = 0; char ch = getchar(); while (ch < '0' || ch > '9') w |= (ch == '-'), ch = getchar(); while ('0' <= ch && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar(); return w ? -x : x; }
	void read(char s[]){ char ch=getchar(),*p=s; while(isspace(ch)) ch=getchar(); while(!isspace(ch)) *p++=ch,ch=getchar();*p='\n'; }
    template <typename T> inline void write(T x) { if (!x) return; write<T>(x / 10), putchar((x % 10) ^ '0'); }
	template <typename T> inline void print(T x) { if (x > 0) write<T>(x); else if (x < 0) putchar('-'), write<T>(-x); else putchar('0'); }
	template <typename T> inline void print(T x, char en) { print<T>(x), putchar(en); }
}; using namespace FastIO;
#undef getchar
const int maxn = 2e5+10,mod = 1e9+7;
int n,q;
ll m;
__int128 nxt[maxn][70];
int pre[maxn];
char s[maxn];
bool no_one(){
    for(int i=0;i<n;++i)
        if(s[i]=='1')
            return 0;
    return 1;
}
void Init(){
    if(no_one()){
        for(int i=0;i<n;++i)
            nxt[i][0]=1;
    }else{
        int l=1,r=2,cnt=0;
        while(cnt<n){
            while(s[l%n]!='1') l++;
            r=l+1;
            while(s[r%n]!='1'){
                pre[r%n]=r-l;
                r++;
                cnt++;
            }
            pre[r%n]=r-l;
            cnt++;
            l=r;
        }
        ll pos=n-1+m;
        for(int i=n-1;i>=0;--i){
            while(pos-i>m) pos-=pre[pos%n];
            if(pos<=i) nxt[i][0]=1;
            else nxt[i][0]=pos-i;
        }
    }
    for(int j=1;j<=66;++j)
        for(int i=0;i<n;++i)
            nxt[i][j]=nxt[i][j-1]+nxt[(nxt[i][j-1]+i)%n][j-1];
}
int main(){
    n=read<int>();
    m=read<ll>();
    q=read<int>();
    read(s);
    Init();
    while(q--){
        ll pos=read<ll>();
        ll k=read<ll>();
        pos--;
        __int128 dis=0;
        for(int i=0;i<=63;++i){
            if((k>>i)&1){
                dis+=nxt[(pos+dis)%n][i];
            }
        }
        print((pos+dis+1)%mod,'\n');
    }
    return 0;
}

WA #11

2024/11/9 14:37
加载中...