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的更多相关文章

  1. [HNOI2012]集合选数(构造,状态压缩,DP)

    神仙题. 莫名其妙的就试一试把所有数放进一个类似矩阵的东西里面. 首先把 \(1\) 放到左上角,然后在每个数的右边放它的 \(3\) 倍(大于 \(n\) 就不用放了),下面放它的 \(2\) 倍( ...

  2. [HNOI2012]集合选数 --- 状压DP

    [HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x ...

  3. bzoj 2734: [HNOI2012]集合选数 状压DP

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 321[Submit][Status ...

  4. $HNOI2012\ $ 集合选数 状压$dp$

    \(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...

  5. 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...

  6. 2734: [HNOI2012]集合选数

    2734: [HNOI2012]集合选数 链接 分析: 转化一下题意. 1 3 9 27... 2 6 18 54... 4 12 36 108... 8 24 72 216... ... 写成这样的 ...

  7. 2734: [HNOI2012]集合选数 - BZOJ

    Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...

  8. [HNOI2012]集合选数(状压DP+构造)

    题目要求若出现x,则不能出现2x,3x 所以我们考虑构造一个矩阵 \(1\ 2\ 4 \ 8--\) \(3\ 6\ 12\ 24--\) \(9\ 18\ 36--\) \(--\) 不难发现,对于 ...

  9. BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]

    传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...

随机推荐

  1. 什么才是java的基础知识?

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  2. java泛型应用实例 - 自定义泛型类,方法

    近 短时间需要使用泛型,就研究了下,发现网上的问关于泛型的文章都是讲原理的, 很少有提到那里用泛型比较合适, 本文就泛型类和泛型方法的使用给出两 个典型应用场景. 例如一个toString的泛型方法, ...

  3. python22期第一天(课程总结)

    1.Python介绍: python是一门高级编程语言,涉及领域比较广泛,社区活跃,由一个核心开发团队在维护,相对其他语言,易于学习,可移植性强,可扩展性强,易于维护,有大量的标准库可供使用. 2.P ...

  4. C++std函数之transform

    /*//////////////////////////////// template < class InputIterator, class OutputIterator, class Un ...

  5. Python 爬取美团酒店信息

    事由:近期和朋友聊天,聊到黄山酒店事情,需要了解一下黄山的酒店情况,然后就想着用python 爬一些数据出来,做个参考 主要思路:通过查找,基本思路清晰,目标明确,仅仅爬取美团莫一地区的酒店信息,不过 ...

  6. 简述Action+Service +Dao 功能

    转载:http://blog.csdn.net/inter_peng/article/details/41021727 1. Action/Service/DAO简介: Action是管理业务(Ser ...

  7. HTML学习笔记 day two

    HTML学习笔记 day two Charter three网站中的文本样式标签 3.1设置标题字体 语法结构:<h#>标题文字</h#> 注:其中的#可以为1,2,3,4,5 ...

  8. 如何使用php生成唯一ID的4种方法

    php生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID.由于生成唯一ID与微秒时间关联,因此ID的唯一性非常 ...

  9. tomcat项目绑定到域名及运行内存配置

    一.tomcat中的项目绑定到域名通过域名访问 1.在tomcat下的conf/server.xml中找到Host修改(1.name为你的域名,2.配置Context中的path为空就是直接访问项目不 ...

  10. 实现MyArrayList类深入理解ArrayList

    ArrayList简介 ArrayList是一个动态数组,Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处. MyArray ...