1.球同,盒不同,不空(隔板法)
一共有 n − 1 n - 1 n−1 个空隙 (总共 n + 1 n + 1 n+1 个空隙,不能空要去掉头尾 = n − 1 n - 1 n−1 ) ,要插 m − 1 m - 1 m−1 个板,从组合角度出发,答案为 C n − 1 m − 1 C _{n-1}^{m-1} Cn−1m−1 ,即 n − 1 n-1 n−1 个缝隙里咱要选上 m − 1 m-1 m−1个隔板,每种选法都是一种方案。
#include <bits/stdc++.h>
#define sf scanf
#define pf printf
using namespace std;
int jie (int x) {
int ans = 1;
for (int i = 2; i <= x; i ++) {
ans *= i;
}
return ans;
}
int C (int n, int m) {
int ans = 0;
ans = (jie (n)) / (jie (m) * jie (n - m));
return ans;
}
int n, m;
int main () {
sf ("%d %d", &n, &m);
pf ("%d", C (n - 1, m - 1));
}
2.球同,盒不同,可空 (还是隔板法)
相当于n个小球放入m个盒子且不能空,为了保证不会空,先拿m个球,让每一个盒子都拥有一个球,相当于多了m个虚球,此时球的数量就是(n+m),隔板就有(m-1)个,缝隙就有(n+m-1)个,所以答案就是 C n + m − 1 m − 1 C_{n+m-1}^{m-1} Cn+m−1m−1 。
#include <bits/stdc++.h>
#define int long long
#define sf scanf
#define pf printf
using namespace std;
int jie (int x) {
int ans = 1;
for (int i = 2; i <= x; i ++) {
ans *= i;
}
return ans;
}
int C (int n, int m) {
int ans =