Codeforces Round #593 (Div. 2) B Alice and the List of Presents

题目链接

题意:这些天爱丽丝收到了很多礼物。所以她决定把它们装进盒子寄给她的朋友们。有n种礼物。一种礼物是相同的(即无法区分两种相同的礼物)。不同种类的礼物是不同的(也就是说,两种不同的礼物是可以区分的)。爱丽丝收到的每一种礼物的数量都非常大,所以我们可以认为爱丽丝收到的每一种礼物的数量是无限的。还有m个盒子。他们都是为不同的人,所以他们是两两不同的(考虑到m个朋友的名字写在盒子上)。例如,把第一种礼物放在第一个盒子里而不是放在第二个盒子里,这与把第一种礼物放在第二个盒子里而不是放在第一个盒子里是不同的。爱丽斯想要用以下规则来包装礼物:她不会在同一个盒子里装超过一件不同种类的礼物,所以每个盒子应该包含不同种类的礼物(即每个盒子包含n个种类的子集,允许有空盒子);每一种礼物至少应装入一个盒子。现在爱丽丝想知道有多少种包装礼物的不同方法。请帮她计算一下这个数字。因为答案可能很大,所以输出109+7的模。参见示例及其注释以获得澄清。输入第一行包含两个整数n和m,用空格(1n, m109)隔开,表示礼物的种类和Alice拥有的盒子的数量。输出打印一个整数的方式来包装的礼物与爱丽丝的规则,计算出的模块109+7
思路:

一种礼物对一个盒子有可放可不放两种,m个盒子共有2^m中,因为每种礼物至少存在一个,要去掉全不放的情况,即2^m-1,共有n种礼物。

所以 (2^m-1)^n;

代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
ll K(ll x,ll n,ll mod){
	ll res=1;
	while(n>0){
		if(n&1)res=res*x%mod;
		x=x*x%mod;
		n>>=1;
	}
	return res;
}
int main(){
	ll n,m;
	scanf("%I64d %I64d",&n,&m);
	ll ans=K(2,m,mod)-1;
	ans=K(ans,n,mod);
	printf("%I64d\n",ans);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值