隔板法就是在以n为末项数列中插入k个隔板从而将数列分成k+1块.
简化题意就是在n的数列中,每次跳大于等于k的距离,跳m次,最后跳到n的方案数。
我们用隔板法理解一下,就是插入m块,保证每个区间的的长度大于等于k即可,此时我们可以把所有的长度都推到左边就变成组合数的问题。
而题目的要求就是在(n-2-(m-1)*(k-1))中选(m-2)的组合数的问题了。
最后用卢卡斯定理判断2的因子来判断奇偶即可。
#include<bits/stdc++.h> #define ll long long using namespace std; ll T,n,m,k; inline ll read() { ll x=0,ff=1; char ch=getchar(); while(!isdigit(ch)) { if(ch=='-') ff=-1; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*ff; } int main() { freopen("1.in","r",stdin); T=read(); for(int i=1;i<=T;i++) { n=read();m=read();k=read(); if(((m-2)&(n-2-(m-1)*(k-1)))==(m-2)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
...