首页 > 其他分享 >二项式反演两题

二项式反演两题

时间:2023-06-06 18:45:01浏览次数:28  
标签:麻花 ch int 特产 JYY 反演 二项式 包子

例题一 [JSOI2011]分特产

题目描述

JYY 带队参加了若干场 \(\text{ACM/ICPC}\) 比赛,带回了许多土特产,要分给实验室的同学们。

JYY 想知道,把这些特产分给 \(n\) 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产。

例如,JYY 带来了 \(2\) 袋麻花和 \(1\) 袋包子,分给 \(A\) 和 \(B\) 两位同学,那么共有 \(4\) 种不同的
分配方法:

\(A\):麻花, \(B\):麻花、包子

\(A\):麻花、麻花, \(B\):包子

\(A\):包子, \(B\):麻花、麻花

\(A\):麻花、包子, \(B\):麻花

思路点拨

我们设 \(f(x)\) 表示至多有 \(x\) 个童鞋获得了特产的方案数。 \(g(x)\) 表示刚好有 \(x\) 个童鞋获得了特产的方案数。那么有

\[f(x)=\sum_{i=0}^x C_{x}^{i}g(i) \]

二项式反演可得:

\[g(x)=\sum_{i=0}^x (-1)^{x-i}C_{x}^if(i) \]

考虑 \(f(x)\) 的求法。我们一个个枚举每一种特产,然后插板法进行分发特产。因为元素可空,所以 \(m\) 个元素分成 \(n\) 分的方案是 \(C_{n+m-1}^{n-1}\) 。

Q:为什么特产需要一个个枚举而不是可以一起分发?
A:因为在本题中,特产是一样的,如果一起分发会造成答案重复。

\(code\)

#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;
}

标签:麻花,ch,int,特产,JYY,反演,二项式,包子
From: https://www.cnblogs.com/Diavolo/p/17461428.html

相关文章

  • 【反演】基于遗传算法实现均匀地层模型随钻电磁波测井反演附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 子集反演
    什么是子集反演?当然在此之前说明子集反演是什么:子集反演用于在恰好是某个子集和在这个子集中钦定/钦定这个子集之间转换。并且子集反演有两种形式。第一种:现在有一个集合\(A\),我们定义\(f(A)\)表示集合\(A\)的答案,\(g(A)\)表示\(A\)的所有子集的答案。如果有......
  • 莫比乌斯反演
    莫比乌斯反演的题主要是构造\(F(n)\)以及\(f(n)\)例题老地方......
  • 莫比乌斯反演与最大公约数
    在数论中,有很多题目都与莫比乌斯反演有关,最典型的就是最大公约数。比如你可以见到如下常见问题。(1)已知,求为质数的的对数,或者等于1的的对数。(2)已知和,求为质数的的对数,或者等于1的的对数。(3)已知,求的对数。(4)已知和,求的对数。上面的问题其实都可以用莫比乌斯反演来解,时间复杂度都还可以......
  • 浅谈反演
    浅谈反演二项式反演\(g_i=\sum\limits_{j=0}\binom{i}{j}f_j,f_i=\sum\limits_{j=0}(-1)^{i-j}\binom{i}{j}g_j\)还有一个的形式\(g_i=\sum\limits_{j=i}\binom{j}{i}f_j,f_i=\sum\limits_{j=i}(-1)^{i-j}\binom{j}{i}g_j\)这里只针对第一个形式,为了得到更普遍的反演,这里我......
  • 容斥与反演技巧(三)
    Min-Max容斥简单来说,由于\(\mathbbE[\max(x,y)]\neq\max(\mathbbE[x],\mathbbE[y])\),而如果计算\(\mathbbE[\min(x,y)]\)比计算\(\mathbbE[\max(x,y)]\)容易得多,我们就通常使用min-max容斥转为计算\(\mathbbE[\min(x,y)]\)。对于上面这种\(x,y\)的情况,实际上......
  • 莫比乌斯反演常见的三个模型
    莫比乌斯反演常见模型模型1:\(\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=t]\)\[\begin{aligned}\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=t]&=\sum_{i=1}^{\lfloor\frac{n}{t}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{t}\rfloor}[gcd(i,j)=1]\\&=\sum_{i=1}^{\lfloor\f......
  • 莫比乌斯反演学习笔记(内涵反演详细推导和证明!)
    莫比乌斯反演前言记得上次学这个东西已经是一年前了,题到没有做过几道……一些有趣的东西莫比乌斯这个人还是很nb的,相信大家都听说过莫比乌斯带,就是他发现的,跟所有数学大佬一样的,他还喜欢天文学和物理废话不扯多了前置知识整除分块一个在数论计算中异常常见的东西,一般和......
  • 6.3 二项式定理
    基础知识二项式定理\((a+b)^n=C_n^0a^nb^0+C_n^1a^{n-1}b^1+\cdots+C_n^ka^{n-k}b^k+\cdots+C_n^na^0b^n\left(n\inN^*\right)\)其中右边的多项式叫做\((a+b)^n\)的二项展开式,其中各项的系数\(C_n^k(k=0,1,2,⋯,n)\)叫做二项式系数\(,C_n^ka^{n-k}b^k\)叫做二项展开式......
  • 拉格朗日反演公式(lagrange inversion)组合证明
    Thereisasimplecombinatorialproof.Theoriginalformis\[[t^n]w^k=\frac{k}{n}[t^{n-k}]\phi^k\]where\(w=t\phi(w)\)consider\(w\)asegf.ofthewaysofsometrees.\(\phi\)asageneratingruleconcerningdegree.\[n![x^n]\frac{w^k}{k......