组合数学
简单组合数学
Love_xyh
这个作者很懒,什么都没留下…
展开
-
CF1420D Rescue Nibel!
很套路地把线段拆为左端点为+1,右端点为-1的两个点后,按照位置从小到大扫过去,当某点为右端点时,统计当前集合中线段个数,然后累加C(sum,k)。(因为左右端点赋了权值,所以集合中线段个数即为当前权值和) 这样做后发现是会有重复的,样例1就很良心地提醒了这一点。 考虑如何容斥,发现不会… 所以改变一下组合数的含义,每次统计时,我们强制当前的最后一条线段必选选,那么现在,就需要在另外的sum-1条线段中选取k-1条了。累加C(sum-1,k-1),不需要去重。 #include <bits/stdc+原创 2020-10-01 12:02:54 · 348 阅读 · 2 评论 -
[SDOI2009]虔诚的墓主人
我们发现是对于每一个空位置,我们求出该空位置上下左右各有多少棵树后,该空位置的贡献就是 这四个方向上树的数量中选K棵出来的方案数的乘积。离散化之后对于答案没有任何影响,所以离散化。 离散化后的点数为n^2,我们把行列拆开考虑。如果我们钦定某一行,我们发现,从左往右看,对于一段左右两棵树相同的连续空地,这段空地的每块空地,左右组合数的乘积是相同的,而每块空地上下组合数的乘积是不同的,所以可以考虑用某个东西来维护上下组合数的乘积,而对于左右组合数乘积,每行扫过去即可。(即,我们需要在每行扫过去的同时,维护每列的原创 2020-08-04 21:07:45 · 141 阅读 · 0 评论 -
AT5312 [ABC156E] Roaming
推出公式即可。 计算组合数时,由于n<=200000,所以可以预处理好bin和inv,表示阶乘和逆元。 #include <bits/stdc++.h> #define int long long using namespace std; const int N=2e5+5,MOD=1e9+7; int n,m,ans; int bin[N],inv[N]; inline in...原创 2020-02-23 23:17:01 · 430 阅读 · 0 评论 -
BZOJ 1008: [HNOI2008]越狱
不会越狱的情况:m*(m-1)^(n-1) 总情况:m^n 相减即可 #include <bits/stdc++.h> #define int long long using namespace std; const int MOD=1e5+3; int n,m,ans; inline int pow(int a,int n) { int res=1; while (n) { ...原创 2019-11-19 22:02:35 · 87 阅读 · 0 评论 -
AT5341 [ABC156D] Bouquet
题意: Akari 有 n 种不同的花,她可以选择其中一种或多种花做成花束。但是 Akari 不喜欢花的种数恰好为 a 或 b 的花束。求出她组合花的合法方案总数,对 10^9+7 取模。 推出公式:ans=(2^n)-C(n,a)-C(n,b)-1 由于n,a,b均小于模数,所以直接算组合数即可,不需要Lucas定理。 下面给出的代码复杂度为:O(min(m,n-m)) 适用于在m比较小,或m与...原创 2020-02-23 15:05:37 · 467 阅读 · 0 评论