【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 ...
随机推荐
- Backlight当前行背景高亮显示
下载地址:https://github.com/limejelly/Backlight-for-XCode PS:Xcode 8.0 默认支持了 跟VVDocumenter规范注释生成器的安装方式一样 ...
- Lua常用时间函数
常用时间函数 print(os.time()) --当前系统时间值 print(os.date( print(os.date("*t"), os.time()) --当前系统时间表 ...
- Visual Studio快捷键大全
快捷键的使用可以简化大家的操作,在一定程度上提高工作的效率,下文中将为大家介绍一些VS中经常用到的快捷键,希望对大家有用. 方法/步骤 关于解决方案和项目 用于快速跳转 用于代码的文本编辑 ...
- Jenkins入门知识
1 修改jenkins的根目录,默认地在C:\Documents and Settings\AAA\.jenkins . .jenkins ├─jobs│ └─JavaHelloWorld│ ...
- PHP文本操作
1. 用PHP获取文件指定行或者随机行 <?php /*** * 功能: 随机获取一个文件里的某一行 * 实现: 先将文件读进一个数组: 随机获取0~数组长度-1之间的一个随机数:以这个随机数做 ...
- mysql查询两个日期之间相差多少天?
需求描述: 在mysql中,查看两个日期之间相差多少天 操作过程: 1.通过datediff函数,查看两个日期之间相差多少天 mysql> select datediff('2018-06-26 ...
- php根据地理坐标获取国家、省份、城市,及周边数据类
功能:当App获取到用户的地理坐标时,可以根据坐标知道用户当前在那个国家.省份.城市,及周边有什么数据. 原理:基于百度Geocoding API 实现,需要先注册百度开发者,然后申请百度AK(密钥) ...
- 存储过程中SELECT INTO的使用
在MySQL存储过程中使用SELECT …INTO语句为变量赋值: 用来将查询返回的一行的各个列值保存到局部变量中. 要求: 查询的结果集中只能有1行. SELECT col_name[,...] I ...
- MySQL性能优化(九)-- 主从复制
一.概念 Mysql复制(replication)是一个异步的复制,从一个Mysql 实例(Master)复制到另一个Mysql 实例(Slave).实现整个主从复制,需要由Master服务器上的IO ...
- hadoop应用开发技术详解
<大 数据技术丛书:Hadoop应用开发技术详解>共12章.第1-2章详细地介绍了Hadoop的生态系统.关键技术以及安装和配置:第3章是 MapReduce的使用入门,让读者了解整个开发 ...