版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题意
给 n 种数量无限的礼物, m个盒子, 输出满足以下条件的组合数
*1 每个盒子礼物种类不能相同
*2 每种情况至少要有一个礼物在盒子里
题解
每种礼物是互相独立的,一个礼物的分配不会影响另一个礼物
可以把某个盒子看成某一个数
这个的数的第 x 位就代表 x 盒子里有没有礼物,那么有 2^m−1 种方法,减一是除去空集, 空集与任意一种方法都是非法的
根据乘法原理最终答案即为每个礼物的方案的乘积 :( 2m − 1 ) n
换种方式理解, 当有一种礼物的时候, 这一种礼物有 ( 2m − 1 ) n 种组合方式, 因为礼物之间是独立互不影响的, 那么, 当有两类礼
物的时候, 一共有( 2m − 1 ) n * ( 2m − 1 ) n 种组合方式, 三类不同类型礼物时 有 ( 2m − 1 ) n * ( 2m − 1 ) n *( 2m − 1 ) n 中组合方式 …
以此类推, 当有 n 类礼物时, 即为 (2^m − 1)^n
受 lyx 大佬的图启发, 而作
代码
#include <bits/stdc++.h>
using namespace std;
#define rg register
#define sc scanf
#define pf printf
typedef long long ll;
const int mod = 1e9+7;
ll qpow ( ll base, ll n ) {
ll ans = 1;
while ( n ) {
if ( n&1 ) ans = ans*base%mod;
base = base*base%mod;
n >>= 1;
}
return ans;
}
int main(){
ll n, m;
cin >> n>> m;
cout << qpow( qpow(2,m)-1, n );
return 0;
}