BZOJ2734 HNOI2012集合选数(状压dp)
完全想不到的第一步是构造一个矩阵,使得每行构成公比为3的等比数列,每列构成公比为2的等比数列。显然矩阵左上角的数决定了这个矩阵,只要其取遍所有既不被2也不被3整除的数那么所得矩阵的并就是所有的数了,并且显然不会有重复。
现在要满足题目要求只需要使在矩阵中选取的数不相邻。显然这可以用状压dp以4^n*m的复杂度搞出来。对于每一个矩阵都这样做一遍再乘起来就可以了。
看起来复杂度非常爆炸。不过冷静分析一下,这样做的复杂度往大了算是Σ4log3(n/i)*log2n,即Σ(n/i)*log34*log2n,也即复杂度不会超过O(nlog2n)。当然远远跑不满。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define P 1000000001
#define N 100010
int n,len[],p[],lg3[N],f[][<<],q[<<],cnt=,ans=;
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2734.in","r",stdin);
freopen("bzoj2734.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
p[]=;for (int i=;i<=;i++) p[i]=p[i-]*;
lg3[]=;
for (int i=;i<=n;i++)
{
lg3[i]=lg3[i-];
if (p[lg3[i]+]<=i) lg3[i]++;
}
for (int i=;i<(<<);i++)
{
int x=i,last=;q[++cnt]=i;
while (x)
{
if ((x&)&&last) {cnt--;break;}
last=x&;x>>=;
}
}
q[cnt+]=<<;
for (int i=;i<=n;i++)
if (i%&&i%)
{
int m;
for (m=;(i<<m-)<=n;m++) len[m]=lg3[n/(i<<m-)];
m--;
f[][]=;
for (int k=;k<=m;k++)
for (int j=;q[j]<(<<len[k]);j++)
{
f[k][j]=;
for (int x=;q[x]<(<<len[k-]);x++)
if (!(q[j]&q[x])) f[k][j]=(f[k][j]+f[k-][x])%P;
}
int tot=;
for (int j=;q[j]<(<<len[m]);j++) tot=(tot+f[m][j])%P;
ans=1ll*ans*tot%P;
}
cout<<ans;
return ;
}
BZOJ2734 HNOI2012集合选数(状压dp)的更多相关文章
- [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 ...
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
- 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...
- $HNOI2012\ $ 集合选数 状压$dp$
\(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...
- bzoj 2734 [HNOI2012]集合选数 状压DP+预处理
这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #inclu ...
- 【BZOJ-2732】集合选数 状压DP (思路题)
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ...
- [BZOJ2734][HNOI2012] 集合选数(状态压缩+思维)
Description 题目链接 Solution 可以根据条件构造出一个矩阵, 1 3 9 27 81... 2 6 18.... 4 12 36... 这个矩阵满足\(G[i][1]=G[i-1] ...
随机推荐
- 树莓派学习笔记(4):利用yeelink实现在线硬件状态监控
转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 一.实验目的 本文实验目的是定时获取树莓派CPU的温度.占用率及内存占用率,并其结果上传到yeelink网站,实现在 ...
- Java安全通信:HTTPS与SSL
转载地址:http://www.cnblogs.com/devinzhang/archive/2012/02/28/2371631.html Java安全通信:HTTPS与SSL 1. HTTPS概念 ...
- shell编程的笔记
关于历史命令 Shell相关 !! 是上一次执行的命令 !字符串 指执行最近一次以这个字符串开头的命令 !$ 取出上一条命令最后一个单词或命令 *匹配0个或多个字符 ?匹配一个字符 ...
- Linux 网络监控工具 ss
ss命令用来显示处于活动状态的套接字信息.功能和netstat类似,但比netstat更快更高效. ss -h Usage: ss [ OPTIONS ] ss [ OPTIONS ] [ FILTE ...
- activiti发布APP时报错:关联的流程无效
解决办法: 1.检查流程命名和任务命名以及其他命名中是否有特殊字符,有一些字符是不支持的.(中文是可以的,中文标点符号可能不行,我的经验是顿号会报错) 2.检查流程图,把鼠标放到每一根连接线上,观察它 ...
- 【SQL】MaxComputer常用SQL与注意小结
MaxComputer常用SQL 1.建表 CREATE TABLE dwd_tfc_ctl_signal_phasedir ( cust_inter_id STRING COMMENT '客户路口I ...
- 20155311《网络对抗》MSF基础应用
20155311<网络对抗>MSF基础应用 实验过程 实验系统 靶机1:Windows XP Professional SP2 ,IP地址:192.168.136.129 靶机2:Wind ...
- 如何完全卸载VS2010(亲自体验过) (转)
1.首先用360卸载,当卸载完成后,提示有残余的话,就强力清除 2,接着,下载IobitUninstaller工具 3.按照下面进行卸载 1.Microsoft .NET Framework 4 框架 ...
- linux中wget的使用方法介绍
wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能和特点:(1)支持断点下传功能:这一点,也是网络蚂蚁和Fl ...
- JavaScript快速入门-ECMAScript运算符
1.逻辑运算符 逻辑与:&&(and) 逻辑或:||(or) 逻辑非:!(not) 逻辑 AND 运算符(&&) 逻辑 AND 运算的运算数可以是任何类型的,不止是 B ...