CodeForces_1236B_AliceAndTheListOfPresents ( 数学 | 规律 | 快速幂 )

文章目录

题目连接 -> vj or cf

题意

给 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值