今天的模拟赛 题目质量一般 不过暴露了很多短板,这里我进行深刻的思考。
这道题不是关键 对于隔板法的证明 大多数都是这样的 在 n个位置放上m个数 且每个数之间相距距离至少为k 求方案数。
显然 我们把(m-1)*k 这些没有用的位置先抽出来 然后再在剩下没有限制的位置上随便放就好了 C(n-(m-1)*k,m);
正确性?我们直接观察很不容易观察出来这个式子的正确性甚至还有可能是不正确的感觉 ,不妨换一个非常直观的角度来看。从答案的角度进行分析,在此之前我们定义每一个板都插到我们选出的数字紧跟其后。这里分析答案的存在性。
对于一个合法的答案来说必然每两个数字之间是>=k的范围 如果刚好为k那么其实我们在前面那个组合数中只要两个数字选择在一起就好了,如果不为k 那么其实前面两个数字之间的距离不为1 遍观所有的答案都符合这样的特点所以该组合数是正确的。
这显然是正确的,我的证明非常的正确 接下来是判断基偶 注意有阶乘分解2的做法 n/2+n/2^2+n/2^3...这样的做法。
注意还有卢卡斯的做法 这个C(n,m) =C(n%2,m%2)*C(n/2,m/2)...注意 C(0,1)==0 显然易得n&m==m时为奇数。
#include<bits/stdc++.h> using namespace std; template<typename T>inline void read(T &x) { x=0; T f=1,ch=getchar(); while (!isdigit(ch)) {if(ch==‘-‘) f=-1; ch=getchar();} while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar(); x*=f; } int T,n,m,k; int main() { read(T); while(T--) { read(n); read(m); read(k); if(k==1) { n-=2;m-=2; if((n&m)==m)puts("Yes"); else puts("No"); continue; } else { n=n-1-k-k+1;m-=2; --k;n-=(m-1)*k; if((n&m)==m)puts("Yes"); else puts("No"); continue; } } return 0; }
原文:https://www.cnblogs.com/chdy/p/11482187.html