BZOJ 2839 集合计数 容斥原理

题目大意:给定n个元素,求交集大小为k的集合的集合共有多少种

考虑容斥原理 计算交集大小至少为i的集合有多少种

首先需要选出i个元素 方案为C(n,i)

其它2^(n-i)个集合每个可选可不选 一共2^[2^(n-i)]种

故答案为Σ[k<=i<=n]C(n,i)C(i,k)*2^[2^(n-i)]

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 1001001
#define MOD 1000000007
using namespace std;
int n,k;
long long fac[M],inv[M],ans;
void Linear_Shaker()
{
    int i;
    fac[0]=1;
    for(i=1;i<=n;i++)
        fac[i]=fac[i-1]*i%MOD;
    inv[1]=1;
    for(i=2;i<=n;i++)
        inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
    inv[0]=1;
    for(i=1;i<=n;i++)
        (inv[i]*=inv[i-1])%=MOD;
}
long long C(long long n,long long m)
{
    return fac[n] * inv[m] % MOD * inv[n-m] % MOD;
}
int main()
{
    int i;
    cin>>n>>k;
    Linear_Shaker();
    long long temp=2;
    for(i=n;i>=k;i--)
    {
        if(i!=n) (temp*=temp)%=MOD;
        ans+= (i-k&1?MOD-1:1) * C(n,i) % MOD * C(i,k) % MOD * temp % MOD;
        ans%=MOD;
    }
    cout<<ans<<endl;
    return 0;
}
时间: 2024-10-06 15:16:24

BZOJ 2839 集合计数 容斥原理的相关文章

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

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2839 设 \( g(i) \) 表示至少有 i 个, \( f(i) \) 表示恰好有 i 个,则 \( g(i)=C_{n}^{i}*(2^{2^{n-i}}-1) \) \( g(i)=\sum\limits_{j=i}^{n}C_{j}^{i}f(j) \) \( f(i)=\sum\limits_{j=i}^{n}(-1)^{j-i}C_{j}^{i}g(j) \) 以为把 g 写

bzoj2839 集合计数

2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 243  Solved: 129 [Submit][Status][Discuss] Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是质数喔~) Input 一行两个整数N,K Output 一行为答案. Sample I

bzoj2839 集合计数(容斥)

2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 883  Solved: 490[Submit][Status][Discuss] Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是质数喔~) Input 一行两个整数N,K Output 一行为答案. Sample Inp

BZOJ 1833 数字计数(统计[a,b]每个数字出现次数)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1833 题意:给定区间[a,b].求区间内0到9每个数字出现的次数. 思路:f[i][j]表示到后i位是否全 0(j=1表示i位之前全0)这个状态某个数字出现的次数,p[i][j]表示这个状态后面有多少个数字.那么当前枚举到的数字为要统计的数字时,答案加 上后面还有多少种数字,即下一个状态的p值.那么我们枚举要统计的数字依次统计即可. i64 f[20][2],p[20][2]; i64

BZOJ 2734 集合选数(状态压缩DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2734 题意:给出一个由1到n的数字组成的集合.定义合法子集为若x在子集中则2x.3x均不能在子集中.求有多少个合法的子集. 思路: 1   3    9 2   6    12 4   12   36 对于上面的矩阵,我们发现就等价于不选相邻数字的方案数.因此枚举每个还没有用到的数字,建立以该数字为左上角的矩阵.接着就是状态压缩DP. int a[N][N]; i64 f[2][1<<

【BZOJ2839】集合计数 组合数+容斥

[BZOJ2839]集合计数 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是质数喔~) Input 一行两个整数N,K Output 一行为答案. Sample Input 3 2 Sample Output 6 HINT [样例说明]假设原集合为{A,B,C}则满足条件的方案为:{AB,ABC},{AC,ABC},{BC,ABC},{AB

51nod 1352:集合计数

1352 集合计数 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数. 提示: 对于第二组测试数据,集合分别是:{1,10},{2,9},{3,8},{4,7},{5,6},{6,5},{7,4},{8,3},{9,2},{10,1}.满足条件的是第2个和第8个. Input 第1行:1

【bzoj 2839】集合计数

权限题 根据广义容斥的套路就很好做了 设\(g_i\)表示交集至少有\(i\)个元素,\(f_i\)表示交集恰好有\(i\)个元素 显然有 \[g_i=\sum_{j=i}^n\binom{j}{i}f_j\] 二项式反演可得 \[f_i=\sum_{j=i}^n(-1)^{j-i}\binom{j}{i}g_j\] 我们求得就是\(f_k\) 我们考虑\(g\)如何求 我们先从\(n\)个元素里选择\(j\)个元素作为我们的交集,这里是\(\binom{n}{j}\),之后对于剩下的\(n-j

bzoj 2005 能量采集 - 容斥原理

栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后, 栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得非常整齐,一共有n列,每列 有m棵,植物的横竖间距都一样,因此对于每一棵植物,栋栋可以用一个坐标(x, y)来表示,其中x的范围是1至n, 表示是在第x列,y的范围是1至m,表示是在第x列的第y棵. 由于能量汇集机器较大,不便移动,栋栋将它放在了 一个角上,坐标正好是(0, 0). 能量汇集机器在汇集的过程中有一定的能量