Description

题目链接

Solution

可以根据条件构造出一个矩阵,

1 3 9 27 81...

2 6 18....

4 12 36...

这个矩阵满足\(G[i][1]=G[i-1][1]*2(1< i),G[i][j]=G[i][j-1]*3(1\leq i,1<j)\)

也就是要满足不能同时选择矩阵中\((G[i][j],G[i][j+1],G[i+1][j])\)

而且会发现,矩阵可能有多个,应枚举矩阵的\(G[1][1]\)并记录下出现过的数

这样会发现矩阵最大长为18,最大宽为11,容易想到状压DP记录一下方案数即可

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 100010
using namespace std; const int mo=1000000001;
int n,g[20][20],b[20],dp[20][2049],Ans=1;
bool vis[N]; int DP(int x){
memset(b,0,sizeof(b));
memset(g,0x3f,sizeof(g));
memset(dp,0,sizeof(dp));
g[1][1]=x;
for(int i=2;i<=18&&g[i-1][1]*1ll*2<=n;++i) g[i][1]=g[i-1][1]*2;
for(int i=1;i<=18;++i)
for(int j=2;j<=11&&g[i][j-1]*1ll*3<=n;++j)
g[i][j]=g[i][j-1]*3;
for(int i=1;i<=18;++i)
for(int j=1;j<=11;++j)
if(g[i][j]<=n) b[i]|=(1<<(j-1)),vis[g[i][j]]=1;
dp[0][0]=1;
for(int i=0;i<18;++i)
for(int S=0;S<=b[i];++S)
if(dp[i][S])
for(int nxS=0;nxS<=b[i+1];++nxS)
if(((S&nxS)==0)&&((nxS&(nxS>>1))==0))//满足限制
(dp[i+1][nxS]+=dp[i][S])%=mo;
return dp[18][0];
} int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
if(!vis[i]) Ans=(Ans*1ll*DP(i))%mo;//乘法原理
printf("%d\n",Ans);
return 0;
}

[BZOJ2734][HNOI2012] 集合选数(状态压缩+思维)的更多相关文章

  1. BZOJ2734 HNOI2012集合选数(状压dp)

    完全想不到的第一步是构造一个矩阵,使得每行构成公比为3的等比数列,每列构成公比为2的等比数列.显然矩阵左上角的数决定了这个矩阵,只要其取遍所有既不被2也不被3整除的数那么所得矩阵的并就是所有的数了,并 ...

  2. 【bzoj2734】集合选数(有点思维的状压dp)

    题目传送门:bzoj2734 这题一个月前看的时候没什么头绪.现在一看,其实超简单. 我们对于每个在$ [1,n] $范围内的,没有因数2和3的数$ d $,将它的倍数$ 2^a 3^b d $一起处 ...

  3. bzoj2734: [HNOI2012]集合选数

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

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

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

  5. BZOJ_2734_[HNOI2012]集合选数_构造+状压DP

    BZOJ_2734_[HNOI2012]集合选数_构造+状压DP 题意:<集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x ...

  6. 2734: [HNOI2012]集合选数

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

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

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

  8. 【BZOJ-2734】集合选数 状压DP (思路题)

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1070  Solved: 623[Submit][Statu ...

  9. luogu P3226 [HNOI2012]集合选数

    luogu 因为限制关系只和2和3有关,如果把数中2的因子和3的因子都除掉,那剩下的数不同的数是不会相互影响,所以每次考虑剩下的数一样的一类数,答案为每类数答案的乘积 如果选了一个数,那么2的因子多1 ...

随机推荐

  1. 【从业余项目中学习2】C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)

    最近正在给客户做的个人项目,要求实现C#与Matlab之间的调用,即C# winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matlab函数返回的结果显示在winform界面上 ...

  2. 02、体验Spark shell下RDD编程

    02.体验Spark shell下RDD编程 1.Spark RDD介绍 RDD是Resilient Distributed Dataset,中文翻译是弹性分布式数据集.该类是Spark是核心类成员之 ...

  3. iOS获取/删除url中的参数

    1.获取URL中的某个参数: - (NSString *)getParameter:(NSString *)parameter urlStr:(NSString *)url { NSError *er ...

  4. Axure 8 Tab制作

    1 在[页面]面板中选中[page1] 2 在[元件库]中选中[动态面板],并拖拽到[设计区域]中 3 双[设计区域]中的动态面板,打开[动态面板管理]页面 4 在[动态面板管理]页面中输入动态面板的 ...

  5. Python 语法基础

    之所以学习Python,第一个是他比较简单,寒假时间充裕,而且听说功能也很不错,最重要的是,我今年的项目就要用到它. 而且刘汝佳的书上说到,一个好的Acmer要是不会一点Python那就是太可惜了.废 ...

  6. Poj(1703),种类并查集

    题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...

  7. python 最简单的web应用(一)

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. server.py文件 #!/usr/bin/env python # -*- coding: ...

  8. 20145238-荆玉茗 《Java程序设计》第7周学习总结

    20145238 <Java程序设计>第7周学习总结 教材学习内容总结 第13章时间与日期 13.1.1 ·即使标注为GMT(格林威治时间),实际上谈到的的是UTC(Unix时间)时间. ...

  9. 整合ssm集成框架

    第一步:配置pom.xml 该代码放在<dependencies>里面 <!--spring 所需要的jar包 web.aop.jdbc.webmvc--> <!--1. ...

  10. jQuery UI datepicker z-index默认为1 怎么处理

    最近在维护一个后台系统的时候遇到这样的一个坑:后台系统中日期控件使用的是jQuery UI datepicker. 这个控件生成的日期选择框的z-index = 1.问题来了.页面上有不少z-inde ...