BZOJ_2734_[HNOI2012]集合选数_构造+状压DP
BZOJ_2734_[HNOI2012]集合选数_构造+状压DP
题意:《集合论与图论》这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中。同学们不喜欢这种具有枚举性 质的题目,于是把它变成了以下问题:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足上述约束条件的子集的个数(只需输出对 1,000,000,001 取模的结果),现在这个问题就 交给你了。
分析:
我们构造出一个矩阵
$\begin{matrix}
1&2^03^1&2^03^2\\
2^13^0&2^13^1&2^13^2\\
2^23^0&2^23^1&2^23^2\\
\end{matrix}
$
发现矩阵的相邻两个格子的数不能同时取
状压DP一下
要把所有不在矩阵中的数当作1重新构造,比如5,7等等
每个矩阵的结果乘起来就是答案
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
LL p=1000000001,A,f[18][1<<12];
int vis[100050],s[18],mat[18][18];
LL ans=1;
void build(int x){
int n=1,m=1,now=x;
while(now*3<=A)m++,now*=3;
now=x;
while(now*2<=A)n++,now<<=1;
int mask=(1<<m)-1;
memset(s,0,sizeof(s));
memset(f,0,sizeof(f));
memset(mat,0,sizeof(mat));
mat[1][1]=x;vis[x]=1;
for(int i=2;i<=m;i++){
mat[1][i]=mat[1][i-1]*3;
vis[mat[1][i]]=1;
}
s[1]=mask;
for(int i=2;i<=n;i++){
mat[i][1]=mat[i-1][1]*2;
vis[mat[i][1]]=1;
for(int j=2;j<=m;j++){
mat[i][j]=mat[i-1][j]*2;
if(mat[i][j]>A){
s[i]=mask^((1<<m-j+1)-1);
break;
}
vis[mat[i][j]]=1;
}
if(!s[i])s[i]=mask;
}
f[0][0]=1;
s[0]=mask;
for(int i=0;i<n;i++){
for(int j=0;j<=mask;j++){
if((j|s[i])!=s[i])continue;
if(j&(j<<1))continue;
for(int k=0;k<=mask;k++){
if((k|s[i+1])!=s[i+1])continue;
if(k&(k<<1))continue;
if(j&k)continue;
f[i+1][k]+=f[i][j];
f[i+1][k]%=p;
}
}
}
LL re=0;
for(int i=0;i<=mask;i++)re+=f[n][i],re%=p;
ans=re*ans%p; /*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",mat[i][j]);
}
puts("");
}*/ /*for(int i=1;i<=n;i++){
printf("%d\n",s[i]);
}*/
}
int main(){
scanf("%lld",&A);
for(int i=1;i<=A;i++){
if(!vis[i])build(i);
}
printf("%lld",ans);
}
BZOJ_2734_[HNOI2012]集合选数_构造+状压DP的更多相关文章
- [HNOI2012]集合选数(构造,状态压缩,DP)
神仙题. 莫名其妙的就试一试把所有数放进一个类似矩阵的东西里面. 首先把 \(1\) 放到左上角,然后在每个数的右边放它的 \(3\) 倍(大于 \(n\) 就不用放了),下面放它的 \(2\) 倍( ...
- [HNOI2012]集合选数 --- 状压DP
[HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x ...
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
- $HNOI2012\ $ 集合选数 状压$dp$
\(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...
- 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...
- 2734: [HNOI2012]集合选数
2734: [HNOI2012]集合选数 链接 分析: 转化一下题意. 1 3 9 27... 2 6 18 54... 4 12 36 108... 8 24 72 216... ... 写成这样的 ...
- 2734: [HNOI2012]集合选数 - BZOJ
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...
- [HNOI2012]集合选数(状压DP+构造)
题目要求若出现x,则不能出现2x,3x 所以我们考虑构造一个矩阵 \(1\ 2\ 4 \ 8--\) \(3\ 6\ 12\ 24--\) \(9\ 18\ 36--\) \(--\) 不难发现,对于 ...
- BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]
传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...
随机推荐
- html5中的全局属性
在html5中,新增了一个"全局属性"的概念,所谓全局属性,是指可以对任何属性都使用的属性.下面列出常用的全局属性. 1.contentEditable属性,是微软开发的,该属性主 ...
- 修改 CKEditor 超链接的默认协议
在 config.js 中添加如下代码 CKEDITOR.on( 'dialogDefinition', function( ev ) { // Take the dialog name and it ...
- unity零基础开始学习做游戏(二)让你的对象动起来
-------小基原创,转载请给我一个面子 小基认为电子游戏与电影最重要的区别就是交互,如果电子游戏没有让你输入的交互功能的话,全程都"只可远观,而不可鼓捣"的话,你可能是在看视频 ...
- 任务调度利器:Celery
http://www.liaoxuefeng.com/article/00137760323922531a8582c08814fb09e9930cede45e3cc000 Celery是Python开 ...
- Linq小整理
Linq(Language Integrated Query)中文翻译为语言集成查询 (1)源起 .net的设计者在类库中定义了一系列的扩展方法 来方便用户操作集合对象 这些扩展方法构成了LINQ的查 ...
- git常用笔记整理
Git 什么是Git 初始化 guthub创建sshKey 下载 上传 更新 创建切换分支 删除分支 合并分支 查看命令历史|提交历史 撤回 设置用户名和密码 查看配置信息 强制pull 强制push ...
- 让 Homebrew 走代理更新 + brew 管理 node 版本
0.前言 环境:MacOS 背景:整理下今天所做的配置. 1. 让 Homebrew 走代理更新 brew update 就卡住了,即使开了 shadowsocks 也不行.因为 shadowsock ...
- spring容器和springmvc容器,以及web容器的关系
说到spring和springmvc,其实有很多人分不清他们有什么区别,认为它俩是一样的,如果你问他项目里用的什么MVC技术,他会说我们用的spring和mybatis,或者spring和hibern ...
- windows下virtualenv中安装MySQL-python
先在正常的环境下安装 MySQL-python-1.2.3.win-amd64-py2.7.exe (用everything搜索一下就出来) 然后到 C:\Python27\Lib\site-pack ...
- Bagging与方差
在集成学习中,通常认为Bagging的主要作用是降低方差,而Boosting的主要作用是降低偏差.Boosting能降低偏差很好理解,因为其原理就是将多个弱学习器组合成强学习器.但Bagging为什么 ...