【CF908E】New Year and Entity Enumeration 位运算+DP
【CF908E】New Year and Entity Enumeration
题意:给定$M=2^m-1$,我们称一个集合S是好的,当且仅当它满足:1.$\forall a\in S,a\ \mathrm{xor}\ M \in S$,2.$\forall a,b\in S,a\ \mathrm{and}\ b \in S$,3.$\forall a\in S,a\le M$。
现在给定集合T,求有多少个好的集合S,满足T是S的子集。
m<=1000,|T|<=50。
题解:显然有了与和取反以后,我们还可以实现或和异或。如果给定T以后,我们对T中的数进行运算能得到什么数呢?容易发现如果二进制位a和位b如果在所有数中都是相同的,那么造出来的数也一定满足位a和位b是相同的。所有满足这个条件的数我们都能造出来。
也就是说,我们只需要确定S中哪些位是始终相同的,即把m个物品分到若干个集合的方案数(Bell数),用$m^2$的DP很容易求出。
但是由于要求T是S的子集,相当于认为的将某些物品分到了一起,我们可以对每个位置维护一个|T|位二进制状态,如果两个位置的状态是不同的,则这两个位置不是始终相同的,则S中对应位置也不能始终相同。所以我们可以对所有相同的状态,代入Bell数求出方案,再将不同状态的方案数乘到一起即可。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll P=1000000007;
bool ban[1010][1010];
int bel[1010];
int n,m;
ll ans;
ll tag[1010],f[1010][1010],s[1010];
char str[1010];
int main()
{
scanf("%d%d",&m,&n);
int i,j,siz;
for(i=1;i<=n;i++)
{
scanf("%s",str+1);
for(j=1;j<=m;j++) if(str[j]=='1') tag[j]|=1ll<<(i-1);
}
ans=f[0][0]=1;
for(i=1;i<=m;i++) for(j=1;j<=i;j++) f[i][j]=(f[i-1][j]*j+f[i-1][j-1])%P,s[i]=(s[i]+f[i][j])%P;
for(i=1;i<=m;i++) if(!bel[i])
{
siz=0;
for(j=i;j<=m;j++) if(tag[j]==tag[i]) bel[j]=i,siz++;
ans=ans*s[siz]%P;
}
printf("%lld",ans);
return 0;
}
【CF908E】New Year and Entity Enumeration 位运算+DP的更多相关文章
- 【洛谷 P4934】 礼物 (位运算+DP)
题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...
- bzoj5108 [CodePlus2017]可做题 位运算dp+离散
[CodePlus2017]可做题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 87 Solved: 63[Submit][Status][Dis ...
- leetcode 201. Bitwise AND of Numbers Range(位运算,dp)
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...
- [BZOJ3054] Rainbow的信号(考虑位运算 + DP?)
传送门 BZOJ没数据范围... 其实数据范围是这样的.. 前20%可以直接n^3暴力枚举每个区间 前40%可以考虑每一位,因为所有数每一位都是独立的,而和的期望=期望的和,那么可以枚举每一位,再枚举 ...
- 2019 ICPC Asia Nanchang Regional C And and Pair 找规律/位运算/dp
题意: 给定一个二进制表示的n,让你找满足如下要求的数对(i,j)的个数 $0 \leqslant j \leqslant i \leqslant n$ $ i & n = i $ $ i & ...
- 51nod 1406 位运算/dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制: ...
- 【BZOJ4300】绝世好题(位运算水题)
点此看题面 大致题意: 给你一个序列\(a\),让你求出最长的一个子序列\(b\)满足\(b_i\&b_{i-1}!=0\). 位运算+\(DP\) 考虑设\(f_i\)表示以第\(i\)个数 ...
- 《分销系统-原创第一章》之“多用户角色权限访问模块问题”的解决思路( 位运算 + ActionFilterAttribute )
此项目需求就是根据给用户分配的权限,进行相应的权限模块浏览功能,因为项目不是很大,所以权限没有去用一张表去存,我的解决思路如下,希望大家给点建议. 数据库用户表结构如下: 数据库表梳理: BankUs ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
随机推荐
- 114自定义UITableViewCell(扩展知识:为UITableViewCell添加动画效果)
关键操作: 效果如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UITableViewCo ...
- 录制iPhone屏幕并转成gif方案
app的开发经常会碰到需要演示一个交互,或者一个bug的情况,通常涉及一连串的操作以及操作的反馈,这是文字,或截图都无法表达的,视频的话还得播放器参与,最好的一个想法应该是录制屏幕然后再转成gif图片 ...
- git恢复本地删除的文件夹取消增加的文件
git项目中有时候会在本地增加或者删除了一些文件或者文件夹,但是又不想提交,一般情况下,我们取消本地所有修改: git checkout . 取消指定文件修改: git checkout filena ...
- CSS 文本缩进,行间距
文本缩进:text-indent:2.0em; 行间距:line-height:1.5em;
- Base64编码——学习笔记
Base64是一种编码方式. 非加密 chcp->936 编码流程: 位数不够后面补0,例中补了2个0. 末尾加=表示结束符. GB2312,有些敏感词不能显示. GBK,是GB2312升级版. ...
- Git初级使用教程
什么是 Git? Git 是一款免费的.开源的.分布式的版本控制系统.旨在快速高效地处理无论规模大小的任何软件工程. 每一个 Git克隆 都是一个完整的文件库,含有全部历史记录和修订追踪能力,不依赖于 ...
- OC中Runtime浅析
近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程 ...
- Java计算几何图形的面积
对于每个几何图形而言,都有一些共同的属性,如名字.面积等,而其计算面积的方法却各不相同.为了简化开发,请编写程序,定义一个超类来实现输入名字的方法,并使用抽象方法来计算面积. 思路分析: 所谓超类就是 ...
- JQuery Mobile 简单入门引导
看了慕课网的jqm视频(http://www.imooc.com/learn/207),觉的不错,简单截几个图,做一下备忘:
- java痛苦学习之路[十]--日常问题汇总
FIddler2 1.FIddler2 request请求的參数出现中文乱码问题时,须要进行一下设置: 打开注冊表编辑器,找到HKCU\Software\Microsoft\Fiddler 2\,在 ...