首页 > 其他分享 >[COCI2011-2012#6] KOŠARE

[COCI2011-2012#6] KOŠARE

时间:2023-08-22 09:24:44浏览次数:38  
标签:箱子 le int KO COCI2011 Output Input include 2012

Problem

有 \(N\) 个箱子、\(M\) 种礼物,第 \(i\) 个箱子里有 \(K_i\) 种礼物。

需要选出一些箱子,要求每一种礼物至少出现在一个箱子中。

求可行的方案数 \(mod\) \(10^9 + 7\) 。

Input

输入第一行,包含正整数 \(N(1 \le N \le 10^6)\) 和 \(M(1 \le M \le 20)\) 。

接下来的 \(N\) 行中,每行包含一个整数 \(K_i(0 \le K_i \le M)\) 和 \(K_i\) 个在 \([1,M]\) 范围内的整数,表示箱子里包含的礼物。

Output

输出仅一行,包含方案数 \(mod\) \(10^9+7\).

Sample

Input 1

3 3
3 1 2 3
3 1 2 3
3 1 2 3

Output 1

7

Input 2

3 3
1 1
1 2
1 3

Output 2

1

Input 3

4 5
2 2 3
2 1 2
4 1 2 3 5
4 1 2 4 5

Output 3

6

Solution

不难看出,这是一道容斥题。同时观察到 \(M\) 较小,可以状压。

定义 \(f_i\) 表示至少不选状态为 \(i\) 的礼物的方案数,可以在读入的时候累计,然后做一遍前缀和得到。

最后做一个容斥,得到最后的结果。

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;

const int kmax = 1e6 + 3;
const int kmaxM = 23;
const int Mod = 1e9 + 7;

int n, m;
int num[kmax][kmaxM], numc[kmax];
long long f[1 << kmaxM];
long long res;
long long p[kmax];

int main() {
    cin >> n >> m;
    for (int i = 1, k; i <= n; i++) {
        cin >> k;
        int tot = 0;
        for (int j = 1, x; j <= k; j++) {
            cin >> x;
            tot |= 1ll << (x - 1); // 排除
        }
        f[((1 << m) - 1) ^ tot]++;
    }
    for (int i = 0; i < m; i++) { // 前缀
        for (int j = 0; j < 1 << m; j++) {
            if (j & (1 << i)) {
                f[j ^ (1 << i)] = (f[j ^ (1 << i)] + f[j]) % Mod;
            }
        }
    }
    p[0] = 1;
    for (int i = 1; i < kmax; i++) { // 预处理2的次方
        p[i] = p[i - 1] * 2 % Mod;
    }
    res = p[n];
    for (int i = 1; i < 1 << m; i++) {
        int tot = __builtin_popcount(i);
        tot = (tot & 1 ? -1 : 1); // 容斥
        res = (res + tot * p[f[i]] % Mod + Mod) % Mod;
    }
    cout << res;
    return 0;
}

标签:箱子,le,int,KO,COCI2011,Output,Input,include,2012
From: https://www.cnblogs.com/ereoth/p/17647596.html

相关文章

  • kotlin协程异常处理之-CoroutineExceptionHandler
    转载请标明出处:https://www.cnblogs.com/tangZH/p/17307406.htmlkotlin协程小记协程的async使用kotlin协程异常处理之-trycatchkotlin协程异常处理之-CoroutineExceptionHandlerCoroutineExceptionHandler用于在协程中捕获异常。一、CoroutineExceptionHandler只能处......
  • Kotlin-大师班 第三章-随笔
    1.Kotlin中,不管是用val或是var声明的变量,都是不可为空的。想让变量可空,需要在声明语句的类型后面加个问号。 2.elvis运算符?:  当你要把一个nullable变量赋值给一个不可空变量时,使用该运算符。否则被赋值变量会被定义为可空变量。 3.doubleexclamation......
  • Perl:Komodo IDE
    1、StrawberryPerl安装 直接下载安装包后安装,非常简单2、ActiveStatePerl安装官网:https://platform.activestate.com/featured-projects   3、KomodoIDE的下载与安装访问ActiveState官网https://www.activestate.com/ 找到KomodoIDE,打开它 点击这个......
  • Kotlin-大师班 第二章-随笔
    1.AppCompatActicity.onCreate()每次Activity创建时调用。Activity对应一个屏幕,如果你的应用程序中有多个屏幕,如登录屏幕、客人资料等,所有这些都是不同的Activity。 可以理解为Activity对等于屏幕。2. setContentView设置View的内容。R代表Resources3.sp:......
  • 「BJWC2012」冻结题解
    「BJWC2012」冻结题解一.题目"我要成为魔法少女!""那么,以灵魂为代价,你希望得到什么?""我要将有关魔法和奇迹的一切,封印于卡片之中"在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符卡)带来的便捷。现在,不需要立下契约也可以使用魔法了!你还不来试一试?比如,我们在......
  • Studio One 6 中挂载 Kontakt 6 教程
    开始之前已经分别安装好StudioOne与Kontakt插件:打开StudioOne,在顶部菜单栏上选择[StudioOne]->[选项...]在弹出的对话框中选择[位置]->[VST插件]->[添加...]找到Kontakt安装目录并"选择文件夹"选中后点击“应用”此时它会扫描一段时间,待进度条结束后......
  • python使用netmiko连接交换机绑定mac
    环境背景python3.8,华为交换机每次手动登录交换机再进行绑定操作,太过机械化啊,本着懒人原则,写一个脚本真不是事情脚本fromnetmikoimportConnectHandlerimporttimedefbing_mac(mac):sw_ip='10.10.10.10'#交换机ipusername='admin'#交换机账号......
  • 安卓kotlin的继续
    https://developer.android.google.cn/jetpack/compose/tutorial?hl=zh-cn#animate-messages-while-expandinghttps://gitee.com/createmaker/my_android_empty_compose_act1这几天请假办理个人事情,真想赶紧能找个合适的合伙人一起创业!......
  • winserver2012安装.net3.5问题
    背景环境winserver2012r2,sqlserver2012因第三方公司开发用到sqlserver,只能安装window系统,但从win2012自带了.net4.5,.net3.5默认是没有的,即使从添加角色和功能向导去添加,也是报缺失源文件解决办法使用安装包离线安装,例如双击2012的iso文件,默认会变成可读盘符,所有的安装包在x:......
  • SQL:DAC模式登陆SQL SERVER 2012 批量执行SQL 脚本文件
    rem将当前目录下的所有*.SQL文件执行一次,并将结果输出文件remfor循环执行SQL命令文件echo=======Begin===========for%%iin(*.sql)do(sqlcmd-A-SLOCALHOST-USA-Pyourpassword-iD:\SQL\IN\%%i-oD:\SQL\OUT\%%i@echoFileName%%i)echo=======end......