首页 > 其他分享 >bzoj 2839. 集合计数 二项式反演

bzoj 2839. 集合计数 二项式反演

时间:2023-06-20 17:45:53浏览次数:59  
标签:int ll bzoj 反演 long 2839 mod include define

集合计数

设fi表示恰好交集为k的方案数。
设gi表示交集至少为k的方案数。

\(g_i=\sum_{j=i}^{n} C(j,i)f_j\)

由二项式反演得:

\(f_k=\sum_{i=k}^{n}(-1)^{i-k}C(i,k)g_i\)

考虑\(g_i\)的求出,钦定\(i\)个数必选那么剩下\(n-i\)个数每个数可选可不选\(2^{n-i}\)

但这道题我们选出的不是数字而是相应的集合。

那么每个集合可选可不选为\(2^{2^{n-i}}\)

但是这是有重复的。

重复的地方在于每个集合全不选的时候和第一个集合也就是空集选其他都不选这两个是等价的所以总方案要\(-1\)。

code
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define inf 100000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define putl_(x) printf("%lld ",x);
#define get(x) x=read()
#define putl(x) printf("%lld\n",x)
#define rep(p,n,i) for(int i=p;i<=n;i+=1)
#define fep(n,p,i) for(int i=n;i>=p;--i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define pii pair<int,int>
#define mk make_pair
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define sq sqrt
#define x(w) t[w].x
#define r(w) t[w].r
#define id(w) t[w].id
#define R(w) s[w].r
#define yy p<<1|1
#define zz p<<1
#define sum(w) t[w].sum
#define mod 1000000007
#define sc(A) scanf("%d",&A)
#define scs(A) scanf("%s",A);
#define put(A) printf("%d\n",A)
#define min(x,y) (x>=y?y:x)
#define max(x,y) (x>=y?x:y)
#define sub(x,y) (x-y<0?x-y+mod:x-y)
using namespace std;
const int MAXN=1000010,G=3;
int n,k,m,T,cnt,lim;
int fac[MAXN],inv[MAXN],a[MAXN],b[MAXN],w[MAXN],f[MAXN],rev[MAXN],g[MAXN];
inline int ksm(int b,int p)
{
	int cnt=1;
	while(p)
	{
		if(p&1)cnt=(ll)cnt*b%mod;
		b=(ll)b*b%mod;p=p>>1;
	}
	return cnt;
}
inline int C(int n,int m){return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;}
inline void NTT(int *a,int op)
{
	rep(0,lim-1,i)if(i<rev[i])swap(a[i],a[rev[i]]);
	for(int len=2;len<=lim;len=len<<1)
	{
		int mid=len>>1;
		int wn=ksm(G,op==1?(mod-1)/len:mod-1-(mod-1)/len);
		for(int j=0;j<lim;j+=len)
		{
			ll d=1;
			for(int i=0;i<mid;++i)
			{
				ll x=a[i+j],y=a[i+j+mid]*d%mod;
				a[i+j]=(x+y)%mod;a[i+j+mid]=(x-y+mod)%mod;
				d=d*wn%mod;
			}
		}
	}
	if(op==-1)
	{
		int IN=ksm(lim,mod-2);
		rep(0,lim-1,i)a[i]=(ll)a[i]*IN%mod;
	}
}
signed main()
{
	freopen("1.in","r",stdin);
	sc(n);sc(k);
	fac[0]=1;
	rep(1,n,i)fac[i]=(ll)fac[i-1]*i%mod;
	inv[n]=ksm(fac[n],mod-2);
	for(int i=n-1;i>=0;--i)inv[i]=(ll)inv[i+1]*(i+1)%mod;
	int ww=2,ans=0;
	fep(n,k,i)
	{
		int cc=(i-k)&1?mod-1:1;
		int w1=(ll)C(n,i)*(ww-1)%mod;
		ans=(ans+(ll)cc*w1%mod*C(i,k))%mod;
		ww=(ll)ww*ww%mod;
	}
	put(ans);
	return 0;
}

标签:int,ll,bzoj,反演,long,2839,mod,include,define
From: https://www.cnblogs.com/chdy/p/17494281.html

相关文章

  • P4859 已经没有什么好害怕的了 二项式反演
    这道题给出两个数组且每个数字都不同。要求两两配对,这样每一个配对都有一个大小关系。要求第一组大的个数比第二组大的恰好k个配对。显然一共有\(n\)个大小关系,那么容易想到\(n-k\)必然是一个偶数才会有对应方案。那么题目其实是要求第一组比第二组大的个数恰好为\(k+\frac{n-k......
  • 【BZOJ 3156】防御准备 题解
    原题令\(S_{i}=\sum_{j=1}^{i}j\),\(f_{i}\)为处理到第\(i\)个位置放置守卫塔的最小花费。观察题意,容易得到在\((1<=j<=i-1)\)时,有\(f_{i}=min\left\{f_{j}+\sum_{k=j+1}^{i-1}(i-k)+a_{i}\right\}\)①\(f_{i}=min\left\{f_{j}+\sum_{k=j+1}^{i-1}(i-k)\ri......
  • [BZOJ 2839] 集合计数
    首先求一个集合的个数可由\(2\cdot2\cdot2\cdot2...\)得到,其中每个二表示选或者不选本个元素。即一个有\(n\)个元素的集合存在\(2^n\)个子集然后同理可得从\(2^n\)个子集中选交集的方案数为\(2\cdot2\cdot2\cdot2...\)(共包含\(2^n\)个\(2\))所以总数......
  • [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题
    [MtOI2019]幽灵乐团/莫比乌斯反演基础练习题题目描述东风谷早苗(KochiyaSanae)非常喜欢幽灵乐团的演奏,她想对她们的演奏评分。因为幽灵乐团有\(3\)个人,所以我们可以用\(3\)个正整数\(A,B,C\)来表示出乐团演奏的分数,她们的演奏分数可以表示为\[\prod_{i=1}^{A}\prod_......
  • BZOJ1461字符串的匹配
    题目具体思路与KMP板子很像;大致思路是将两个数字的排名来当字符比较用树状数组\(log_2(n)\)的复杂度来找排名。一定要注意边界问题具体实现思路可以看代码(PS:有奆佬说这题很板子,也许是我太弱了叭QAQ)//9:30开始写题,有些思路//40思路被pass,不会写了//55决定......
  • 题解 BZOJ4399 魔法少女LJJ
    前言XXX:你瞅你长得那个B样,俺老孙就(氧化钙)......这魔法(J8)少女能不能去死啊啊啊啊啊啊啊啊啊啊......正文"LJJ你是来搞笑的吧"你说得对,但是这数据就是骗人的.首先看题面:然后看样例:最后看数据范围:我惊奇的发现\(c\le7\)!家人们我真难绷qaq...问题分析显......
  • P5518 [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题
    简要题意计算\[\prod_{i=1}^{A}\prod_{j=1}^{B}\prod_{k=1}^{C}\left(\frac{\text{lcm}(i,j)}{\gcd(i,k)}\right)^{f(type)}\]其中:\[\begin{aligned}f(0)&=1\crf(1)&=i\timesj\timesk\crf(2)&=\gcd(i,j,k)\end{aligned}\]\(T\)组数据,每......
  • bzoj4399: 魔法少女LJJ
    bzoj4399:魔法少女LJJ题目描述在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新、淡雅,到处散发着醉人的奶浆味;小猴在枝头悠来荡去,好不自在;各式各样的鲜花争相开放,......
  • 算法学习笔记(24): 狄利克雷卷积和莫比乌斯反演
    狄利克雷卷积和莫比乌斯反演看了《组合数学》,再听了学长讲的……感觉三官被颠覆……目录狄利克雷卷积和莫比乌斯反演狄利克雷卷积特殊的函数函数之间的关系除数函数和幂函数欧拉函数和恒等函数卷积的逆元莫比乌斯函数与莫比乌斯反演求法数论分块(整除分块)莫比乌斯反演的经典结......
  • 莫比乌斯反演
    这里讲述几个莫比乌斯反演的套路技巧。我们从一道道例题讲起。\(\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd(i,j)=1]=\sum_{i=1}^n\mu(i)\lfloor\frac{n}{i}\rfloor^2\)这就是一般公式\([gcd(i,j)=1]=\sum_{d|i,d|j}^n\mu(d)\)的衍生,不会做不了题。暴力算\(\gcd\)转换为枚举......