题意翻译
有nn种物品和mm个背包,每种物品有无限个,现将若干个物品放到这些背包中,满足:
1、每个背包里不能出现相同种类的物品(允许有空背包);
2、在所有的mm个背包中,每种物品都出现过。
求方案数,对10^9+7取模。
转载至 风华正茂
尽管比赛时推了20min,我太蒟了。
假如这道题目没有“每种物品都出现过”的限制,那么它的答案就是 2^nm
那么加上这个限制呢,每种物品必须要放,只用将每种物品的方案减一即可,也就是 2^m-1
所以用乘法原则得到 ans=(2^m-1)^n
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
#define int long long
int n,m;
inline int ksm(int x,int y){
int ans=1;
while(y){
if(y&1)ans=(ans*x)%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
signed main(){
cin>>n>>m;
printf("%lld\n",ksm(ksm(2,m)-1,n));
}