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;
}