ZR#999

解法:

一道计数题,看到要求必须 $ m $ 个标号,所有标号至少出现一次的方案。

很容易想到可以容斥,但容斥这个东西是一种很神奇的东西,你可以看出来一道题需要容斥,但你就是不知道怎么容斥。

原题的等价形式为:总方案减去至少不出现一种玩具的方案数。

考虑容斥 , 那么就有

$ \bigcup ^ {n} _ {i = 1} A_i = \sum ^ {n} _ {k = 1} (-1) ^ {k-1} \sum _ {1 \leq i_1 < i_2 \cdots i_k \leq n} \mid A_{i_1} \cap A_{i_2} \cap \cdots \cap A _ {i_k} \mid $

设 $ f_i $ 表示状态为 $ i $ 时所有元素都在集合 $ i $ 中的方案数。(不要求包含 $ i $ 中的所有元素)然后用容斥原理算一下即可。

但是这个题数据范围比较大,需要用 $ FWT $ (高维前缀和)来维护 。

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define N 1 << 20
const int p = 1e9 + 7; int n,m,k,x,res,ans;
int f[N],t[N],cnt[N],flag; inline int read() {
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {if (ch == '-')f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
return x * f;
} int main() {
n = read(),m = read();
flag = (1 << m) - 1;
cnt[0] = 1;
for(int i = 1 ; i <= n ; i++) {
k = read();
res = 0;
for(int j = 1 ; j <= k ; j++) {
x = read();
res |= 1 << (x - 1);
}
++f[res];
}
for(int i = 1 ; i <= m ; i++) {
for(int j = 1 ; j <= flag ; j++) {
if(j & (1 << (i - 1)))
f[j] += f[j ^ (1 << (i - 1))];
}
}
for(int i = 1 ; i <= n ; i++) {
cnt[i] = cnt[i - 1] << 1;
if(cnt[i] >= p) cnt[i] -= p;
}
for(int i = 0 ; i <= flag ; i++) {
t[i] = t[i >> 1] + i & 1;
if(!((m - t[i]) & 1)) ans += cnt[f[i]] - 1;
else ans -= cnt[f[i]] - 1;
if(ans >= p) ans %= p;
else if(ans < 0) ans += p;
}
printf("%d \n",ans);
//system("pause");
return 0;
}

最新文章

  1. Windows phone 8.0 本地化遇到的两个问题
  2. 【iOS开发】UIWebView与JavaScript(JS) 回调交互
  3. WebLogic Exception
  4. 可滑动的ToggleButton(开关)
  5. jquery load
  6. 从M个数中随机选出N个数的所有组合,有序,(二)
  7. GCD之Apply
  8. hadoop ha zkfc 异常自动切换机制和hdfs 没有空间问题解决
  9. bat路径中有空格
  10. bootstrap_响应式布局简介_媒体查询_媒体选择器_2x3x图
  11. 第7天:Q Quant库(未完待续)
  12. 对yolo与fasterrcnn anchors的理解
  13. VB.NET网络是否联通Function
  14. linux基础之vim编辑器
  15. IOS语法
  16. iOS archive(归档)
  17. IOS客户端Coding项目记录(二)
  18. 播放MP3
  19. 迭代器.NET实现—IEnumerable和IEnumerator (foreach实现)
  20. 用requests自动访问网页,下载网页内容

热门文章

  1. 使用docker搭建reids主从,哨兵。
  2. 【转】JRE和JDK的区别
  3. U-Boot补丁 S3C2440
  4. stm32 CAN通信 TJA1040
  5. centos7 安装jdk及mysql8
  6. 表格分页——tablePagination
  7. hive分区理念介绍
  8. JetBrains 系列开发工具 汉化(中文化)教程
  9. HTML和XML中的转义字符
  10. SSM - SpringBoot - SpringCloud