*盒子与球问题是一个经典的组合数学问题,通常涉及将一定数量的球放入一定数量的盒子中,并考虑不同的约束条件(如允许或不允许盒子为空等)。以下是一个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;
}

球不同,盒子相同,盒子可以为空。

球不同,盒子相同,盒子不可以为空。

球相同,盒子也相同,盒子可以为空。

球相同,盒子也相同,盒子不可以为空。