排列组合

排列组合
求组合数
#1
int inv[N], mul[N];
int ksm(int a, int b, int mod) {
int ans = 1;
while (b) {
if (b & 1)
ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
void init() {
inv[0] = mul[0] = 1;
for (int i = 1; i < N; i++)
mul[i] = mul[i - 1] * i % mod;
inv[1000001] = ksm(mul[1000001], mod - 2, mod);
for (int i = 1000000; i > 0; i--)
inv[i] = inv[i + 1] * (i + 1) % mod;
}
int C(int n, int m) {
if(n < m) return 0;
return mul[n] * inv[m] % mod * inv[n - m] % mod;
}#2
void init() {
c[0][0] = 1;
for (int i = 1; i <= 400; i++) {
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; j++) {
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
}
}多重组合数
有l个物品,给每个人分配c_i个,求有多少种方案:
排列组合实际问题总结
不定方程的解
求不定方程的解的数量,其中为整数,且
隔板法:(k-1)块板把n个小球分成n份
若
换元:
此时答案为
网络路径计数
在n*m的网格图上,从(0,0)走到(n,m),每次只能向右或者向上走,求方案数。
共走n+m步,有m步向上
容斥
容斥
求正整数1-n中,既不是2的倍数也不是3的倍数的数的数量
求n个元素1-n组成的全排列,满足1与2不相邻,3与4也不相邻的方案数
把n件不一样的物品放到三个不同盒子里,满足每个盒子至少要有一个物品的方案数。
有
2n个元素,和,求有多少个它们的全排列,满足任意的,和都不相邻。
S={全排列},,有种
求不定方程的解的数量,其中为整数,且
那么就转化成了之前在排列组合中提到的问题
错排问题
p是1,2,…,n的一个排列,满足,给定n,求满足要求的排列有多少个。
有种
容斥原理的符号形式

这样就可以用求出有些性质有,有些性质没有的方案数
例:求正整数1-n中,既不是2的倍数也不是3的倍数,但是是5的倍数的数的数量。
p是1,2,…,n的一个排列,满足刚好存在k个,给定n,k,求满足要求的排列有多少个。
第二类斯特林数
有n个互不相同的球,放到k个互不区分的盒子里,每个盒子里至少要有一个球,求方案数。
#1:dp,f[n][k]表示前n个球放k个盒子,k*f[n-1][k]+f[n-1][k-1]
#2:将盒子从1到k编号,a_i表示第i个盒子没有球。
故
第二类斯特林数的一些公式

对于图中最后一个公式,可以看成是n个不同的盒子中放m个球,即为n^m,也可以看成每次从n个盒子中取k个盒子,即为
完全错排
//写法1:
int D(int n)
{
if (n == 0 || n == 1)
return 0;
else if (n == 2)
return 1;
else
return (n-1) * (D(n-2) + D(n-1));
}//写法2:
int ans = 1;
for (int i = 1; i <= n; i++) {
ans = (ans * i % mod + ((i & 1) ? -1 : 1));
}
ans %= mod;

Last updated