cf B. Alice and the List of Presents(分礼物,组合数学)

探讨了在特定条件下,计算不同种类礼物包装到多个盒子中的组合方式。通过数学算法和编程实现,解决了爱丽丝如何根据规则将礼物分配到不同盒子的问题。

经谷歌翻译------------------------------------

最近,爱丽丝收到了很多礼物。因此,她决定将它们包装在盒子中,然后发送给她的朋友。 有n种礼物。一种礼物是相同的(即无法区分两种相同的礼物)。不同种类的礼物是不同的(即,两种不同种类的礼物是可区分的)。爱丽丝所拥有的每种礼物的数量非常大,因此我们可以认为爱丽丝具有无限数量的每种礼物。 另外,还有毫米盒。它们都是针对不同的人的,因此它们是成对的(考虑到m朋友的名字写在盒子上)。例如,将第一种礼物放入第一个盒子而不是第二个盒子,不同于将第一种礼物放入第二个盒子而不是第一个盒子。 爱丽丝想用以下规则包装礼物: 她不会在同一个盒子里装多于一件的每种礼物,因此每个盒子应该包含不同种类的礼物(即每个盒子包含n种子集,允许有空盒子); 对于每种种类,至少应将一个礼物装在一个盒子里。 现在,爱丽丝想知道有几种包装礼物的方式。请帮助她并计算这个数字。由于答案可能很大,因此请10^9 + 7为模输出。 请参阅示例及其注释以进行澄清

输入

第一行包含两个整数nn和mm,以整数(1≤n,m≤10^9)隔开-礼物的种类和爱丽丝的盒子数。

输出

打印一个整数-用10^9 + 7模计算的用爱丽丝规则包装礼物的方式数量

样例1

Input
1 3
Output
7

样例2

Input
2 2
Output
9

备注

每个盒子都不一样

礼物一个个的发
发一种有2^m-1
发n种就有(2^m -1) ^n;

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <stdlib.h>
#include <math.h>
#include <string.h>
// *start on @date: 2020-02-14 17:27 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int maxn = -999999;
int minn = 999999;
const int mod = 1e9+7;
ll qpow ( ll base, ll n ) {
    ll ans = 1;
    while ( n ) {
        if ( n&1 ) 
        ans = ans*base%mod;  
        //     & 1的结果就是取二进制的最末位。
        //这可以用来判断一个整数的奇偶,
        //二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。
        base = base*base%mod;
        n >>= 1; //比如原来n是8,他的二进制数为1000,进行>>1右移一位后就是100,
    }
    return ans;
}
int main()
{
	ll n, m;
	cin >> n>> m;
	cout << qpow( qpow(2,m)-1, n );
	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值