Educational Codeforces Round 120 D

D. Shuffle

题链
很容易看出我们每k个来看
并且要把左右衍生到最长
那么我们这一坨的就可以算出来是C len m
我们模拟完第一个样例发现多了4
原来每个之间都会有重复的
比如1100110
我们重复的就是固定了第一个1和第三个1
然后第二个1的C31
第二陀和第三陀也就是第4个1的C31
当然每次要减去本身就给出来的这个一个1

int z(int x){
    for(int i=x-1;i>=1;i--){
        if(A[i]){
            return x-i-1;
        }
    }
    return x-1;
}
int y(int x){
    for(int i=x+1;i<=n;i++){
        if(A[i]){
            return i-x-1;
        }
    }
    return n-x;
}
void solve(){
    cin>>n>>m;
    A.resize(n+1);
    int sum=0;
    vector<int>pos(1);
    for(int i=1;i<=n;i++){
        char c;cin>>c;
        A[i]=c-'0';
        sum+=A[i];
        if(A[i])pos.push_back(i);
    }
    if(!m){cout<<1<<endl;return;}
    if(sum<m){cout<<1<<endl;return;}
    int ans=0;
    for(int i=1,j=m;j<pos.size();i++,j++){
        int l=pos[i],r=pos[j];
        int len=z(l)+y(r)+r-l+1;
        (ans+=C(len,m)-1)%=mod;
    }
    for(int i=2,j=m;j<(int)pos.size()-1;i++,j++){
        int l=pos[i],r=pos[j];
        int len=z(l)+y(r)+r-l+1;
        (ans-=C(len,m-1)-1)%=mod;
    }
    cout<<(ans+1+mod)%mod<<endl;
}
posted @ 2022-12-29 23:16  ycllz  阅读(11)  评论(0)    收藏  举报