CodeForces - 1236B (簡單組合數學)

題意

n種物品和m個揹包,每種物品有無限個,現將若干個物品放到這些揹包中,知足:html

一、每一個揹包裏不能出現相同種類的物品(容許有空揹包);ios

二、在全部的m個揹包中,每種物品都出現過。c++

求方案數,對10^9+7取模。spa

思路

考慮每一個物品在每一個揹包是否出現,那麼對於物品i,有2^m中方案,而後由於在全部揹包中每種物品至少要出現一次,因此要減去全不出現的方案,因此是2^m - 1,有n個物品,那麼就是(2^m -1)^nhtm

代碼

 

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll gcd(ll a,ll b){return b==0?a:gcd(b,a%b);}
ll qpow(ll a,ll b){ll res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;}
ll inv(ll a,ll p){return qpow(a,p-2);}
int main()
{
    std::ios::sync_with_stdio(false);
    ll n,m;
    cin>>n>>m;
    cout<<qpow((qpow(2,m)-1+mod)%mod,n)<<endl;
    return 0;
}
相關文章
相關標籤/搜索