题目:B. Alice and the List of Presents
题意:有n个礼物和m个盒子,每种礼物可以放多个但是不能放在同1个盒子里,要求所有盒子包含所有种类礼物(至少1个),问有多少种放法?
分析:由题意可得每个礼物相对独立,只是要求每个礼物都存在,那么将这个问题分成n个子问题,1个礼物面对m个盒子有多少种放法?显然,对1个盒子有放和不放2种选择,那么我们总共有2m种放法,但是题目要求每个礼物都要存在,那么在2m种放法中减去每个盒子都不放的1种放法,所以对于1个礼物,我们有2m-1种放法。那么对于相对独立的n个礼物,不难得出总共有(2m-1)n种放法。
AC代码:
#include <bits/stdc++.h>
#define ll long long
#define mo 1000000007
using namespace std;
ll fastpow(ll a,ll p)
{
ll ans=1;
while(p){
if(p&1)ans=(ans*a)%mo;
p>>=1;
a=(a*a)%mo;
}
return ans%mo;
}
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
ll one=fastpow(2,m)-1; //计算一个的方案,2代表放和不放2种选择,减去都不放的一种方案
ll ans=fastpow(one,n); //每个相对独立,总共有n个
cout<<ans<<endl;
return 0;
}
如有错误感谢指正!