*盒子与球问题是一个经典的组合数学问题,通常涉及将一定数量的球放入一定数量的盒子中,并考虑不同的约束条件(如允许或不允许盒子为空等)。以下是一个C++程序示例,它汇总了8种不同情况的盒子与球问题。
为了简化,我们假设每种情况都涉及将n个球放入k个盒子中,并考虑以下情况:
球和盒子均不同,盒子可以为空。
解析:从每个球的角度出发,每个球都有M种放法,所以就是 M^N
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//快速幂
ll qmi(ll a,ll b){
ll res = 1;
while(b){
if(b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
ll n,m;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
while(cin >> n >> m)
//求m的n次方
cout << qmi(m,n) << endl;
return 0;
}
球和盒子均不同,盒子不可以为空。
球相同,盒子不同,盒子可以为空。
球相同,盒子不同,盒子不可以为空。
解析:这个就是经典的隔板法问题,相当于把N个球用隔板分成M个部分 N个球有N-1个空隙,在空隙中选择M-1个作为隔板将原来分成M个部分,所以答案是 C(M−1,N−1)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll sp[20];
ll qmi(ll a,ll b){
ll res = 1;
while(b){
if(b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
ll C(ll a,ll b){
if(b > a) return 0;
ll p = sp[a];
ll q = sp[b];
ll r = sp[a - b];
ll res = p / q;
return res / r;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
ll n,m;
sp[0] = 1;
for(int i = 1; i <= 15; i++) sp[i] = sp[i-1] * i;
while(cin >> n >> m){
cout << C(n-1,m-1) << endl;
}
return 0;
}