【BZOJ2734】【HNOI2012】集合选数(状态压缩,动态规划)
【BZOJ2734】【HNOI2012】集合选数(状态压缩,动态规划)
题面
Description
《集合论与图论》这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中。同学们不喜欢这种具有枚举性 质的题目,于是把它变成了以下问题:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足上述约束条件的子集的个数(只需输出对 1,000,000,001 取模的结果),现在这个问题就 交给你了。
Input
只有一行,其中有一个正整数 n,30%的数据满足 n≤20。
Output
仅包含一个正整数,表示{1, 2,..., n}有多少个满足上述约束条件 的子集。
Sample Input
4
Sample Output
8
Hint
【样例解释】
有8 个集合满足要求,分别是空集,{1},{1,4},{2},{2,3},{3},{3,4},{4}。
题解
这题太好了,
这题真的是好题
好神奇的做法
找个矩形出来
1 2 4 8 16 .....
3 6 12 24 48 .....
9 18 36 72 144 .....
. . . . . . .
. . . . . . .
然后,就变成了,有若干个这样的矩阵
求出选不相邻的数的选法数
So Easy呀。。。
但是真心想不到
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;
#define MOD 1000000001
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
/*
这题真的好神奇...
构造一个矩形出来看看
1 2 4 8 16 .....
3 6 12 24 48 .....
9 18 36 72 144 .....
. . . . . . .
. . . . . . .
很神奇呀
题目就变成了,有若干个这样的矩形,
每次可以从矩形中选择不相邻的数,问有多少选法
然后状压DP就可以了
*/
int f[20][1<<12],N;
int ss[20];
bool p[1<<12];
bool check(int x)
{
return p[x];
}
int solve(int x)
{
memset(f,0,sizeof(f));
memset(ss,0,sizeof(ss));
f[0][0]=1;
int n=0,s;
for(n=1,s=x;s<=N;++n,s*=2)
for(int k=s;k<=N;k*=3)ss[n]++;n--;
for(int i=1;i<=n;++i)
{
for(int j=0;j<(1<<ss[i-1]);++j)
{
if(!check(j))continue;
for(int k=0;k<(1<<ss[i]);++k)
{
if(!check(k))continue;
if(j&k)continue;
f[i][k]=(f[i][k]+f[i-1][j])%MOD;
}
}
}
int re=0;
for(int i=0;i<(1<<ss[n]);++i)re=(re+f[n][i])%MOD;
return re;
}
int main()
{
N=read();
for(int i=0;i<(1<<12);++i)
if(!(i&(i<<1))&&!(i&(i>>1)))p[i]=true;
int ans=1;
for(int i=1;i<=N;++i)
if((i%2)&&(i%3))ans=(1LL*ans*solve(i))%MOD;
printf("%d\n",ans);
return 0;
}
【BZOJ2734】【HNOI2012】集合选数(状态压缩,动态规划)的更多相关文章
- [BZOJ2734][HNOI2012] 集合选数(状态压缩+思维)
Description 题目链接 Solution 可以根据条件构造出一个矩阵, 1 3 9 27 81... 2 6 18.... 4 12 36... 这个矩阵满足\(G[i][1]=G[i-1] ...
- BZOJ2734 HNOI2012集合选数(状压dp)
完全想不到的第一步是构造一个矩阵,使得每行构成公比为3的等比数列,每列构成公比为2的等比数列.显然矩阵左上角的数决定了这个矩阵,只要其取遍所有既不被2也不被3整除的数那么所得矩阵的并就是所有的数了,并 ...
- bzoj2734: [HNOI2012]集合选数
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{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 ...
- BZOJ_2734_[HNOI2012]集合选数_构造+状压DP
BZOJ_2734_[HNOI2012]集合选数_构造+状压DP 题意:<集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x ...
- 2734: [HNOI2012]集合选数
2734: [HNOI2012]集合选数 链接 分析: 转化一下题意. 1 3 9 27... 2 6 18 54... 4 12 36 108... 8 24 72 216... ... 写成这样的 ...
- [HNOI2012]集合选数 --- 状压DP
[HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x ...
- 【BZOJ-2734】集合选数 状压DP (思路题)
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ...
- luogu P3226 [HNOI2012]集合选数
luogu 因为限制关系只和2和3有关,如果把数中2的因子和3的因子都除掉,那剩下的数不同的数是不会相互影响,所以每次考虑剩下的数一样的一类数,答案为每类数答案的乘积 如果选了一个数,那么2的因子多1 ...
- bzoj 2734 [HNOI2012]集合选数 状压DP+预处理
这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #inclu ...
随机推荐
- virtualbox命令行共享CentOS目录
virtualbox命令行共享CentOS目录 1. 安装virtualbox增强工具 "右ctrl+c" 显示和隐藏virtualbox虚拟机的菜单栏. 在VirtualBo ...
- 微信小程序Md5加密(utf-8汉字无影响)
微信小程序不让使用第三方jqMD5 只好改原生js咯 废话不多说直接贴代码 其实就是将原生function调用改为 module.exports = md5; 文中 红色标注 使用方法 将md5.js ...
- 机器学习03:K近邻算法
本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...
- 【学习笔记】Hibernate HQL连接查询和数据批处理 (Y2-1-7)
HQL连接查询 和SQL查询一样 hql也支持各种链接查询 如内连接 外连接 具体如下 左外连接 left (outer) join 迫切左外连接 left (outer) join fetch 右外 ...
- ubuntu终端常用命令及solarized配色(护眼)
ubuntu终端常用命令及solarized配色(护眼) ubuntu 终端 命令 1.常用命令 ctrl + l - 清屏 . cLear ctrl + c - 终止命令. ctrl + d ...
- Java上传Excel并解析
1.上传: public String uploadFile(CommonsMultipartFile file,String uploadPath,String realUploadPath){ I ...
- $.ajax的一些坑啊
1.如果发送ajax返回的数据为json务必设置其 Content-Type:application/json;charset=UTF-8 不然会导致其success:function(data)中的 ...
- 解决cookies存储中文报错问题
URLEncoder.encode("username", "UTF-8"); URLDecoder.decode("123", " ...
- Go语言学习_Win10下安装Go开发环境
关于Go语言有多么值得学习,这里就不做介绍了,既然看了这篇文章,想必是对有学习意向. 这里是在Windows下安装Go环境,去中文社区的下载栏目,https://studygolang.com/dl ...
- 第二十一章 Django的分页与cookie
第二十一章 Django的分页与cookie 第一课 模板 1.模板的继承 在Template目录下新建模板master.html <!DOCTYPE html> <html lan ...