Alice and the List of Presents
題目
思路:
把n件物品拆成一件一件來考慮;
對於每一件物品,要保證至少有一個是放在m個包中的某一個包裏的,那麼總的合法方案就是 2^m-1(對於每一個包放或者不放,最後減去全不放的情況);
總的答案 就是第一種的物品的方案 * 第二種物品的方案 * …… =(2^m-1) ^ n ;(要把每一種物品放置 組合成 n 種物品放置);
同時這種考慮方法也規避掉了一個包 放置多個同一種物品的情況;
#include<bits/stdc++.h>
#define ll long long
using namespace std;
typedef unsigned long long ULL;
const int N=100010;
ll mod=1e9+7;
long long qPow(long long int a,long long int n){
long long int ans=1;
while(n>0){
if(n&1)//取二進制最末端
ans=(ans*a)%mod;
a=(a*a)%mod;
n>>=1;//右移一位
//將n寫成二進制的形式,遇到1就與結果相乘
}
return ans;
}
int main() {
int m,n;
cin>>m>>n;
ll temp=qPow(2,n)-1;
l ans=qPow(temp,m);
cout<<ans<<endl;
return 0;
}