80pts玄关求条
查看原帖
80pts玄关求条
845988
Shizaki_Crazy_Three楼主2024/11/9 16:33
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
const int N=4e5+5;
char s[N];
int a[N];
int f[65][N];
int g[65][N];
int n,m,q;
signed main(){
    scanf("%lld%lld%lld",&n,&m,&q);
    cin>>s+1;
    int t=0;
    for(int i=1;i<=n;i++) if(s[i]=='1') t=i;
    for(int i=1;i<=n;i++){
        if(s[i]=='1') t=i;
        a[i]=t;
    }
    if(t){for(int i=1;i<=n;i++){
        if(i+m<=n){
            if(a[i+m]>i){
                f[0][i]=a[i+m];
                g[0][i]=a[i+m]-i;
            }else {
                f[0][i]=i%n+1;
                g[0][i]=1;
            }
        }else{
            if(m>=n) {
                //cout<<i<<endl;
                f[0][i]=a[(i+m-1ll)%n+1ll];
                g[0][i]=f[0][i]-i+(i+m-1ll)/n*n;
            }else{
                int x=a[(i+m-1ll)%n+1ll];
                if(x>i||x<=(i+m-1ll)%n+1ll){
                    f[0][i]=a[(i+m-1ll)%n+1ll];
                    if(x>i)
                    g[0][i]=f[0][i]-i;
                    else g[0][i]=f[0][i]+n-i;
                }else {
                    f[0][i]=i%n+1ll;
                    g[0][i]=1ll;
                }
            }
        }
    }}else{
        for(int i=1;i<=n;i++) f[0][i]=i+1ll,g[0][i]=1ll;
    }
    // for(int i=1;i<=n;i++){
    //     cout<<g[0][i]<<' ';
    // }
    // cout<<endl;
    // for(int i=1;i<=n;i++){
    //     cout<<f[0][i]<<' ';
    // }
    // cout<<endl;
    for(int i=1;i<=64;i++){
        for(int j=1;j<=n;j++){
            f[i][j]=f[i-1][f[i-1][j]];
            g[i][j]=(g[i-1][j]+g[i-1][f[i-1][j]])%mod;
            //cout<<g[i][j]<<' '<<endl;
        }
    }

    while(q--){
        int s,k;
        scanf("%lld%lld",&s,&k);
        int temp=s%mod;
        __int128 ans=0;
        s=(s-1)%n+1;
        //cout<<'----------------'<<endl<<s<<endl;
        for(int i=63;i>=0;i--){
            int c=(1ll<<i);
            if(k&c){
                ans=(ans+g[i][s])%mod;
                s=f[i][s];
                //cout<<s<<endl;
                k^=(1ll<<i);
            }
        }
        int op=ans%mod;
        printf("%lld\n",(op+temp)%mod);
    }

    return 0;
}

2024/11/9 16:33
加载中...