
组合数学
Aurora141592
这个作者很懒,什么都没留下…
展开
-
NOWCODER – 小G砍树(组合数学 + 换根dp)
https://ac.nowcoder.com/acm/problem/22732终于把这题补了。。首先是组合数学的部分,设dp[i]表示以i为根的树的答案(合法排列数),对于根节点为x的树来说,这棵树的所有子节点可以形成((size_x – 1)!)种排列,假设节点y与节点x直接相连,则节点y能形成(size_y!)种排列,但是其中只有dp[y]种是合法的,所以((size_x – 1)!)需要先除掉(size_y!),再乘上dp[y],才是以y为根的子树对dp[x]的真正贡献。dp[i]更新方向为自原创 2021-01-14 12:29:15 · 112 阅读 · 0 评论 -
[组合数学]组合数有关的公式及常用求和
O(logn)求组合数fac[maxn] = {1, 1, 2};ll C(int n, int m){return (fac[n] * quickpow((fac[m] * fac[n - m]) % mod, mod - 2)) % mod;}for (int i = 3; i < maxn; ++i) fac[i] = (i * fac[i - 1]) % mod;O(n^2)递推求组合数for(int i = 0; i < maxn; ++i){ CC[i][0] =原创 2021-01-08 13:55:00 · 2323 阅读 · 0 评论 -
ABC – 042 – D – Iroha and a Grid(排列组合)
https://abc042.contest.atcoder.jp/tasks/arc058_b?lang=en由于左下角有禁区,所以左上角到右下角的路径分为两段,一段从左上角到禁区的上面那一行,一段从禁区的上面那一行到右下角,然后求和即可,这题是用来保存组合数取模模板的。ll quickpow(ll x, int k){ ll res = 1; while(k){ if(k & 1) res = (res * x) % mod; k >&原创 2021-01-05 13:23:06 · 268 阅读 · 0 评论 -
NOWCODER – 小G砍树(组合数学 + 换根dp)
https://ac.nowcoder.com/acm/problem/22732终于把这题补了。。首先是组合数学的部分,设dp[i]表示以i为根的树的答案(合法排列数),对于根节点为x的树来说,这棵树的所有子节点可以形成((size_x – 1)!)种排列,假设节点y与节点x直接相连,则节点y能形成(size_y!)种排列,但是其中只有dp[y]种是合法的,所以((size_x – 1)!)需要先除掉(size_y!),再乘上dp[y],才是以y为根的子树对dp[x]的真正贡献。dp[i]更新方向为自原创 2020-11-04 21:23:51 · 100 阅读 · 0 评论 -
[数论]伯努利数
线性求逆元快速版#include<bits/stdc++.h>#define MOD mod#define MAX maxnusing namespace std;typedef pair<int, int> pii;typedef long long ll;const double eps = 1e-6;const int maxn = 2e3 + 10, inf = 0x3f3f3f3f, mod = 1e9 + 7;ll quickpow(ll x, ll k原创 2020-07-04 16:40:10 · 431 阅读 · 0 评论 -
洛谷 P5520 [yLOI2019] 青原樱(组合数学 + 不互质逆元)
s://.luogu.com.cn/problem/P5520我组合数学也太菜了吧,这题思路相当简单。第一种想法是:m个树占m个位置,然后拿m – 1个位置填在m个树之间,然后就是一个n – 2 * m + 1个球放m + 1个盒子里,盒子可以为空的放法数了,结果就是Cn–m+1mC_{n – m + 1}^{m}Cn–m+1m。另一种思路更简单,就是先抽出m – 1个位置出来,然后剩下的位置里选m个,直接就是Cn–m+1mC_{n – m + 1}^{m}Cn–m+1m种了,然后把这m – 1个位置原创 2020-07-04 16:33:28 · 379 阅读 · 0 评论 -
51nod – 1627 瞬间移动(组合数学)
????/.51nod.com/Challenge/Problem.html#problemId=1627有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案,答案对1000000007取模。每次每行每列都至少加1,至多走到终点的行列,所以行列可以单独分开看,行从1走到n,列从1走到m,枚举行列在中间停留的次数,假设n < m,最终答案就是∑i=0n−2Cn−2i∗Cm−2i原创 2020-07-04 16:30:58 · 301 阅读 · 0 评论 -
51nod 1161 Partial Sums(组合数学)
题目链接把每次求前缀和操作在纸上画一下就会发现每个位置的值就等于这次的上一个位置的值加上上次的这个位置的值之和,就可以想到和机器人走方格有关,找规律之后我们发现求k次前缀和之后aia_iai对位置j(j>=i)j (j>=i)j(j>=i)的贡献的贡献为Ck−1+(j−i)j−iC_{k - 1 + (j - i)}^{j - i}Ck−1+(j−i)j−i,预处理计算出这n个值就完事了。在这里插入代码片...原创 2020-05-09 10:09:13 · 193 阅读 · 0 评论 -
[组合数学]组合数有关的公式及常用求和
O(logn)求组合数fac[maxn] = {1, 1, 2};ll C(int n, int m){return (fac[n] * quickpow((fac[m] * fac[n - m]) % mod, mod - 2)) % mod;}for (int i = 3; i < maxn; ++i) fac[i] = (i * fac[i - 1]) % mod;O(n^2)递推求组合数for(int i = 0; i < maxn; ++i){ CC[i][0] =原创 2020-05-09 09:28:16 · 3913 阅读 · 0 评论