【BZOJ】集合计数-组合数学/容斥原理/线性推逆元

原创 2018年04月15日 22:01:21

传送门:bzoj2839集合计数


题意

一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得
它们的交集的元素个数为K,求取法的方案数,答案模1000000007。


数据范围

对于100%的数据,1≤N≤1000000;0≤K≤N;


题解

首先学一波线性推逆元
设模为p。现在对于1,2,3…p-1求在模p(p为质数)意义下的逆元。
首先设:
p=k·i+q(0<i<p,0<q<i)
则:
k·i+q0 (mod p)
同时乘上i1,q1:
k·q1+i1 0 (mod p)
移项得:
i1k·q1 (mod p)
即:
i1pi·(p mod i)1 (mod p)
这样就可以愉快的推逆元啦~~
然后本蒟蒻模了一发详细的题解
保证至少选k个的,枚举每一种情况。
而至少有这k个元素的集合有2nk个,我们可以要或者不要,那么就22nk种方案。
但是我们至少要选择一个集合(该集合恰为这k个数),所以事实上是22nk1种方案。
但在这样无脑枚举的时候,会把交集大于k的算重(非常显然),然后我们又会发现,算重的次数也是有规律的,所以容斥一下??
然后式子它长这样:
Σi=kn(1)ikc(k,i)c(i,n)(22ni1)
大家还是去看上面贴的那篇题解吧(本蒟蒻说不清楚了)

代码

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
typedef long long ll;
ll e[N],inv[N],ans;
int n,k;

int main(){
    e[1]=1;e[0]=1;inv[0]=1;
    for(int i=2;i<N;i++){
        e[i]=e[i-1]*(ll)i%mod;
    }
    inv[1]=1;
    for(int i=2;i<N;i++){
        inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
    }
    for(int i=2;i<N;i++){
        inv[i]=inv[i]*inv[i-1]%mod;
    }
    scanf("%d%d",&n,&k);
    int st;ll t=2;
    if((n-k)%2==0) st=1;
    else st=-1;
    for(int i=n;i>=k;i--,st=-st){
        ll ret=e[n]*inv[i-k]%mod*inv[k]%mod*inv[n-i]%mod*(t-1)%mod;
        t=t*t%mod;
        ans=((ans+st*ret)%mod+mod)%mod;
    }
    printf("%lld\n",ans);
    return 0;

}
版权声明:侵删,转载请附带链接或评论 https://blog.csdn.net/corsica6/article/details/79954023

远程线程嵌入技术

远程线程嵌入技术   远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进...
  • Drate
  • Drate
  • 2003-02-22 09:59:00
  • 1634

[BZOJ2839]集合计数(容斥原理+组合数学)

题目描述传送门题解首先考虑固定k个元素,方案为CknC_n^k 还剩下2n−k2^{n-k}个集合,可以任选若干个集合C12n−k+C22n−k+..+C2n−k2n−k=22n−kC_{2^{n-...
  • Clove_unique
  • Clove_unique
  • 2017-03-21 23:31:34
  • 595

[容斥原理] BZOJ 2839 集合计数

考虑容斥原理 计算交集大小至少为i的集合有多少种 首先需要选出ii个元素 方案为CinC_n^i 其它2n−i2^{n−i}个集合每个可选可不选 一共22n−i−12^{2^{n−i}}−1种 ...
  • u014609452
  • u014609452
  • 2017-02-21 18:48:22
  • 450

BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元

2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2417 Solved: 803 [Submi...
  • DaD3zZ
  • DaD3zZ
  • 2016-02-19 18:52:09
  • 511

【BZOJ2839】集合计数,容斥原理

.
  • xym_CSDN
  • xym_CSDN
  • 2017-01-07 19:00:53
  • 759

[BZOJ4710][Jsoi2011]分特产(容斥原理+组合数学)

题目描述传送门题解这道题的限制其实挺不明显的,应该是“每个人都至少有一个” 也就是说对于所有的物品,将其划分成n部分,每部分不能为空,问总的方案数 可以如果利用插板法的话,把n个相同的小球放到m个...
  • Clove_unique
  • Clove_unique
  • 2017-03-22 14:18:11
  • 928

线性求逆元

线性求逆元 1−1≡1(mod p)1^{-1}\equiv1(mod\ p) 令p=k∗i+r,r
  • firenet1
  • firenet1
  • 2015-10-05 20:06:54
  • 1477

线性求逆元算法

摘自:http://blog.csdn.net/acdreamers/article/details/8220787 其实有些题需要用到模的所有逆元,这里为奇质数。那么如果用快速幂求时间复杂度为,...
  • qq_34564984
  • qq_34564984
  • 2016-08-23 16:57:16
  • 2695

[BZOJ4517][Sdoi2016]排列计数(组合数+逆元)

被做不出来的题卡了一晚上心情不爽只能来发题解玩的ATP= =
  • FromATP
  • FromATP
  • 2016-10-09 21:59:20
  • 302

乘法逆元+线性求mod p的所有数逆元

http://blog.miskcoo.com/2014/09/linear-find-all-invert [数论]线性求所有逆元的方法  September 7, 2014  miskco...
  • liuxingwan
  • liuxingwan
  • 2015-11-21 20:46:56
  • 705
收藏助手
不良信息举报
您举报文章:【BZOJ】集合计数-组合数学/容斥原理/线性推逆元
举报原因:
原因补充:

(最多只允许输入30个字)