二项式反演两题
例题一 [JSOI2011]分特产
题目描述
JYY 带队参加了若干场
JYY 想知道,把这些特产分给
例如,JYY 带来了
分配方法:
思路点拨
我们设
二项式反演可得:
考虑
Q:为什么特产需要一个个枚举而不是可以一起分发?
A:因为在本题中,特产是一样的,如果一起分发会造成答案重复。
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int MAXN=2e3+10,N=2e3,mod=1e9+7;
int sum[MAXN]={1},inv[MAXN]={1};
int qpow(int a,int b){
int ans=1,base=a;
while(b){
if(b&1) ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return ans;
}
void prepare(){
sum[0]=inv[0]=1;
for(int i=1;i<=N;i++){
sum[i]=sum[i-1]*i%mod;
inv[i]=qpow(sum[i],mod-2);
}
}
int C(int n,int m){return sum[n]*inv[m]%mod*inv[n-m]%mod;}
int n,m,a[MAXN];
signed main(){
prepare();
n=read(),m=read();
int ans=0;
for(int i=1;i<=m;i++){
a[i]=read();
ans+=a[i];
}
if(ans<n) cout<<0;
else{
ans=0;
for(int i=0;i<=n;i++){
int temp=C(n,i);
for(int j=1;j<=m;j++)
temp=temp*C(i+a[j]-1,i-1)%mod;
if((n-i)&1) ans=(ans-temp+mod)%mod;
else ans=(ans+temp)%mod;
}
cout<<ans;
}
return 0;
}
例题二 [JSOI2015]染色问题
题目描述
萌萌家有一个棋盘,这个棋盘是一个
现在萌萌和南南有
- 棋盘的每一个小方格既可以染色(染成
种颜色中的一种),也可以不染色。 - 棋盘的每一行至少有一个小方格被染色。
- 棋盘的每一列至少有一个小方格被染色。
- 每种颜色都在棋盘上出现至少一次。
以下是一些将
请你求出满足要求的不同的染色方案总数。只要存在一个位置的颜色不同,即认为两个染色方案是不同的。
思路点拨
二项式反演可以将 恰好有 的问题转化为 不超过 的问题 。
按照一般的想法,我们定义
那么二项式反演,有:
考虑
接下来
减去
将上述公式回代进行整理可以得到以下代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=401,N=400,mod=1e9+7;
int n,m,c,ans,sum[MAXN]={1},inv[MAXN]={1};
int qpow(int a,int b){
int ans=1,base=a;
while(b){
if(b&1) ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return ans;
}
int C(int n,int m){return sum[n]*inv[m]%mod*inv[n-m]%mod;}
signed main(){
cin>>n>>m>>c;
for(int i=1;i<=N;i++){
sum[i]=sum[i-1]*i%mod;
inv[i]=qpow(sum[i],mod-2);
}
for(int i=0;i<=c;i++)
for(int j=0;j<=m;j++)
ans=(ans+(C(c,i)*C(m,j)%mod*qpow(-1,c+m-i-j)+mod)%mod*qpow(qpow(i+1,j)-1+mod,n)%mod)%mod;
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?