求助95pts WA on #14
查看原帖
求助95pts WA on #14
554145
Night_sea_64楼主2024/11/9 22:22

link

#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int mod=1e9+7;
int n,m,q,a[400010],last[400010];
int d1[200010][70],d2[200010][70];
signed main()
{
    scanf("%lld%lld%lld",&n,&m,&q);
    for(int i=1;i<=n;i++)
    {
        char c;
        cin>>c;
        a[i]=a[i+n]=c-'0';
    }
    for(int i=1;i<=2*n;i++)
    {
        if(a[i]==1)last[i]=i;
        else last[i]=last[i-1];
    }
    for(int i=1;i<=n;i++)
        if(m<n)
        {
            if(last[i+m]<=i)d1[i][0]=d2[i][0]=1;
            else d1[i][0]=d2[i][0]=last[i+m]-i;
        }
        else
        {
            if(!last[n])d1[i][0]=1%n,d2[i][0]=1;
            else
            {
                int r=i+(m-1)%n+1;
                d1[i][0]=(m-r+last[r])%n,d2[i][0]=(m-r+last[r])%mod;
            }
        }
    for(int j=1;j<=61;j++)
        for(int i=1;i<=n;i++)
        {
            int nxt=(i+d1[i][j-1]-1)%n+1;
            d1[i][j]=(d1[i][j-1]+d1[nxt][j-1])%n;
            d2[i][j]=(d2[i][j-1]+d2[nxt][j-1])%mod;
        }
    while(q--)
    {
        int ss,k;
        scanf("%lld%lld",&ss,&k);
        int now=(ss-1)%n+1,ans=ss%mod;
        for(int i=61;i>=0;i--)
            if(k>=(1ll<<i))
            {
                k-=(1ll<<i);
                ans=(ans+d2[now][i])%mod;
                now=(now+d1[now][i]-1)%n+1;
            }
        printf("%lld\n",ans);
    }
    return 0;
}
2024/11/9 22:22
加载中...