BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接
https://www.lydsy.com/JudgeOnline/problem.php?id=2734
题解
嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解
神仙题,做法大概就是,构造一个矩阵,左上角是\(1\), 往下每个数都是上面的\(3\)倍,往右每个数都是左面的\(2\)倍,然后在上面跑状压DP,求有多少种选法使得没有两个被选的位置有公共边
然后把左上角改成\(5,7,11...\)分别做一遍,答案相乘即可
嗯,时间复杂度……玄学?
下面给出我的分析:
考虑对一个\(r\)行\(c\)列(\(r<c\))的矩阵进行状压DP,长度为\(r\)的没有连续两个\(1\)的01序列个数是\(Fib(r)=O(1.618^r)\), 故状压DP的复杂度为$$O((1.6182)r\times c)=O(2.618^rc)$$
对于一个左上角是\(i\)的矩阵,行数为\(O(\log_3{\frac{n}{i}})\), 列数为\(O(\log_2{\frac{n}{i}})\), 故进行状压DP的复杂度为$$O(2.618{\log_3{\frac{n}{i}}}\log_2\frac{n}{i})=O((\frac{n}{i}){0.876}\log n)$$
而我们要做的就是对\(i=1,5,7,11...\)求和,那么不妨放缩成对\(i=1,2,...,n\)求和,$$\sum{n}_{i=1}(\frac{n}{i}){0.876}\log n=n^{0.876}\log n\int{n}_{0}x{-0.876}\text{d}x=O(n\log n)$$
代码
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<iostream>
#define llong long long
using namespace std;
inline int read()
{
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return -x;
}
const int N = 1e5;
const int P = 1e9+1;
const int lg2N = 17;
const int lg3N = 11;
int cnt[N+3];
llong dp[lg2N+2][(1<<lg3N)+3];
int n;
llong ans;
bool isok(int x) {return (x&(x>>1))==0 && (x&(x<<1))==0;}
void updsum(llong &x,llong y) {x = (x+y)%P;}
void solve(int x)
{
llong ret = 0ll; int x0 = x;
for(int i=1; x<=n; i++,x*=2)
{
int xx = x; cnt[i] = 0;
for(; xx<=n; cnt[i]++,xx*=3);
for(int j=0; j<(1<<cnt[i]); j++)
{
if(isok(j))
{
if(i==1) {dp[i][j] = 1ll;}
else
{
int jj = ((1<<cnt[i-1])-1)^j;
for(int k=jj; k>=0; k=(k==0?-1:((k-1)&jj)))
{
updsum(dp[i][j],dp[i-1][k]);
}
}
if(x*2>n) {updsum(ret,dp[i][j]);}
}
}
}
ans = ans*ret%P;
x = x0;
for(int i=1; x<=n; i++,x*=2)
{
int xx = x,nn = 1;
for(int j=0; j<(1<<cnt[i]); j++)
{
dp[i][j] = 0ll;
}
cnt[i] = 0;
}
}
int main()
{
scanf("%d",&n); ans = 1ll;
for(int i=1; i<=n;)
{
solve(i);
if(i%6==1) i+=4;
else i+=2;
}
printf("%lld\n",ans);
return 0;
}
BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)的更多相关文章
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
- bzoj 2734 [HNOI2012]集合选数 状压DP+预处理
这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #inclu ...
- [HNOI2012]集合选数 --- 状压DP
[HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x ...
- 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...
- $HNOI2012\ $ 集合选数 状压$dp$
\(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...
- 【BZOJ-2732】集合选数 状压DP (思路题)
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ...
- 【BZOJ-2734】集合选数 状压DP (思路题)
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ...
- BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]
传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...
- bzoj 2734: [HNOI2012]集合选数
题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中. 同学们不喜 ...
随机推荐
- 搭建自己的框架WedeNet(五)
WedeNet2018.WedeWcfServices-WCF服务层:结构如下: 就是定义了服务契约接口和服务类,以OrderServices为例,如下: using System; using Sy ...
- 最全MySQL面试题和答案
Mysql 的存储引擎,myisam和innodb的区别. 答: 1.MyISAM 是非事务的存储引擎,适合用于频繁查询的应用.表锁,不会出现死锁,适合小数据,小并发. 2.innodb是支持事务的存 ...
- LeetCode 172:阶乘后的零
给定一个整数 n, 返回 n! 结果中尾数为零的数量. 示例 : 输入: 输出: 解释: ! = , 尾数中没有零. 示例 : 输入: 输出: 解释: ! = , 尾数中有个零. 说明:算法的时间复杂 ...
- java八个框架
在本文中,我只是整理了以下主流框架: 1.阿帕切米纳 项目主页:http://mina.apache.org/ 它为开发高性能和高可用性网络应用提供了一个非常方便的框架,支持基于Java NIO技术的 ...
- .NET中跨线程访问winform控件的方法
1 第一种方式 MethodInvoker invoker = () => { richTextBox1.AppendText(_ClientSocketModelConnectedEvent. ...
- Java高并发程序设计学习笔记(五):JDK并发包(各种同步控制工具的使用、并发容器及典型源码分析(Hashmap等))
转自:https://blog.csdn.net/dataiyangu/article/details/86491786#2__696 1. 各种同步控制工具的使用1.1. ReentrantLock ...
- 3.移动端自动化测试-appium环境搭建(原理)
appium自动化原理: 需要服务端(appium启动),手机端(adb连接设备),脚本端(pycharm)就可以进行 自己总结下: 手机和脚本连接:1.adb连接,2靠脚本导入驱动. 脚本和服务端连 ...
- TCP/IP网络知识
1.TCP/IP概念 TCP/IP不是单指一种传输协议,而是一组传输控制协议/互联网协议. 2.TCP/IP分层 (计算机网络中,实际应用的网络协议是TCP/IP协议族,TCP/IP的应用层大体上对应 ...
- 7、TortoiseSVN
7.TortoiseSVN TortoiseSVN图标介绍: 目录空白处右键→TortoiseSVN→Settings 7.1独立将工程上传到服务器的思路 12.2针对archetype-catalo ...
- Hive的日志操作
想要看hive的日志,我们查看/home/hadoop/hive/conf/hive-log4j2.properties # list of properties property.hive.log. ...