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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44510468/article/details/102632771

文章目录

题目连接 -> 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44510468/article/details/102632771
今日推荐