题意翻译
有nn种物品和mm个背包,每种物品有无限个,现将若干个物品放到这些背包中,满足:

1、每个背包里不能出现相同种类的物品(允许有空背包);

2、在所有的mm个背包中,每种物品都出现过。

求方案数,对10^9+7取模。


转载至 风华正茂

尽管比赛时推了20min,我太蒟了。

假如这道题目没有“每种物品都出现过”的限制,那么它的答案就是 2^nm

那么加上这个限制呢,每种物品必须要放,只用将每种物品的方案减一即可,也就是 2^m-1

所以用乘法原则得到 ans=(2^m-1)^n

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
#define int long long
int n,m;
inline int ksm(int x,int y){
    int ans=1;
    while(y){
        if(y&1)ans=(ans*x)%mod;
        x=x*x%mod;
        y>>=1;
    }
    return ans;
}
signed main(){
    cin>>n>>m;
    printf("%lld\n",ksm(ksm(2,m)-1,n));
}
01-01 14:45
查看更多