【bzoj2734】集合选数(有点思维的状压dp)
题目传送门:bzoj2734
这题一个月前看的时候没什么头绪。现在一看,其实超简单。
我们对于每个在$ [1,n] $范围内的,没有因数2和3的数$ d $,将它的倍数$ 2^a 3^b d $一起处理。因为每个数$ d $之间没有2和3作为公因数,所以统计时互不影响。
对于$ d $的倍数$ 2^a 3^b d $,我们可以发现如果把它按因子2的次数为行,因子3的次数为列,把这些数排列在一个矩形中,相当于是在一个阶梯状的棋盘上选择最多的互不相邻的格子。这个可以用状压dp计算。
其实这题的主要难度在于复杂度的分析,我一个月前也是没算出复杂度然后主观否决了这个方案。
于是我们现在来分析一下时间复杂度:
对于数$ d $,将其倍数$ 2^a 3^b $排列成的矩形的规模是$ \log_2(\frac{n}{d}) \times \log_3(\frac{n}{d}) $的,而对于一个$ n \times m $的矩形进行状压dp选择最多的互补相邻的格子的时间复杂度为$ O(2.618^mn) $(因为可以预处理出每一行的所有满足选择的格子互不相邻的有效状态,而有效状态的数量是$ O(1.618^m) $的,所以综合起来复杂度就是$ O(2.618^mn) $)。因此,处理数d时所花费的时间复杂度为$ O(\frac{n}{d} \log(\frac{n}{d})) $。
因此,总时间复杂度为:$ \sum_{d=1}^{n}\frac{n}{d} \log(\frac{n}{d}) = n \log^2 n $
代码:
#include<cstdio>
#include<cmath>
#define ll long long
#define mod 1000000001
#define maxn 100010
int vis[maxn],can[][<<],st[];
ll a[][],f[][];
int n;
int work(int x)
{
int w=(int)(log(n/x)/log()+1e-)+,h=(int)(log(n/x)/log()+1e-)+,tot=;
a[][]=x;
for(int i=;i<=w;i++)
a[][i]=a[][i-]*;
for(int i=;i<=h;i++)
for(int j=;j<=w;j++)
a[i][j]=a[i-][j]*;
for(int i=;i<=h;i++)
for(int j=;j<=w;j++)
if(a[i][j]<=n)vis[a[i][j]]=;
for(int i=;i<=h;i++)
for(int j=;j<<<w;j++){
int flag=;
for(int k=;k<w;k++)
if((j&(<<k))&&a[i][k+]>n){
flag=; break;
}
if(flag)can[i][j]=;
else can[i][j]=;
}
for(int i=;i<<<w;i++)
if(!(i&(i<<))&&!(i&(i>>)))st[++tot]=i;
f[][]=;
for(int i=;i<=h;i++)
for(int j=;j<=tot;j++){
f[i][j]=;
for(int k=;k<=tot;k++)
if(can[i][st[j]]&&can[i-][st[k]]&&!(st[j]&st[k])){
f[i][j]+=f[i-][k];
if(f[i][j]>=mod)f[i][j]-=mod;
}
}
int ans=;
for(int i=;i<=tot;i++)
if(can[h][st[i]]){
ans+=f[h][i];
if(ans>=mod)ans-=mod;
}
return ans;
}
int main()
{
scanf("%d",&n);
ll ans=;
for(int i=;i<=n;i++)
if(!vis[i])ans=ans*work(i)%mod;
printf("%lld\n",ans);
}
bzoj2734
【bzoj2734】集合选数(有点思维的状压dp)的更多相关文章
- bzoj2734 集合选数
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...
- 『数 变进制状压dp』
数 Description 给定正整数n,m,问有多少个正整数满足: (1) 不含前导0: (2) 是m的倍数: (3) 可以通过重排列各个数位得到n. \(n\leq10^{20},m\leq100 ...
- 【思维题 状压dp】APC001F - XOR Tree
可能算是道中规中矩的套路题吧…… Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...
- “景驰科技杯”2018年华南理工大学程序设计竞赛 A. 欧洲爆破(思维+期望+状压DP)
题目链接:https://www.nowcoder.com/acm/contest/94/A 题意:在一个二维平面上有 n 个炸弹,每个炸弹有一个坐标和爆炸半径,引爆它之后在其半径范围内的炸弹也会爆炸 ...
- 骨牌摆放方案数n*m(状压DP)
题意:https://www.nitacm.com/problem_show.php?pid=1378 如题. 思路: 从第一行for到最后一行,枚举每一行的所有状态,进行转移,注意答案是dp[最后一 ...
- BZOJ_2734_[HNOI2012]集合选数_构造+状压DP
BZOJ_2734_[HNOI2012]集合选数_构造+状压DP 题意:<集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x ...
- POJ 1684 Corn Fields(状压dp)
描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...
- BZOJ1087【状压DP】
题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1087] 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击 ...
- 【BZOJ-2734】集合选数 状压DP (思路题)
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ...
随机推荐
- HDU3658—How many words
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3658 题目意思: 题目的意思是在52个英文字母里面选择m个字母组成一个字符串,满足以下两个条件.第一是 ...
- 刚开始学Python,坚持下去
嗯,刚开始学Python没几天,挺好的一门语言,十分简洁,也很好上手. 坚持下去,每天至少看一个小时的Python.
- 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...
- python基础-第十三篇-13.1web框架本质
基础与概念 众所周知,对于所有的web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 web框架分两类:一类是包括socket和业务逻辑(tornado),另一 ...
- 国产服务器离线安装gm
离线安装过程: 1.安装JPEGlib cd /opt/ ls tar -zxvf jpegsrc.v9b.tar.gz cd jpeg-9b/ ./configure make make insta ...
- 011-HQL中级1-Hive快捷查询:不启用Mapreduce job启用Fetch task三种方式介绍
如果你想查询某个表的某一列,Hive默认是会启用MapReduce Job来完成这个任务,如下: hive; Total MapReduce jobs Launching Job out since ...
- spring MVC学习(一)---前端控制器
1.spring MVC中的前段控制器就是DsipatcherServlet,它在spring MVC框架中的结构图如下: 2.DispatcherServlet其实就是一个Servlet,它继承了H ...
- HBase存储架构
以下的介绍是基于Apache Hbase 0.94版本: 从HBase的架构图上可以看出,HBase中的存储包括HMaster.HRegionServer.HRegion.Store.MemStore ...
- HDU1520:Anniversary party(树形dp第一发)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1520 一个公司去参加宴会,要求去的人不能有直接领导关系,给出每一个人的欢乐值,和L K代表K是L的直接领导 ...
- SQL Server 2008数据库手动提交的设置
有时候我们需要对SQL Server 2008数据库手动提交的方法进行设置,使用Oracle的朋友会注意到Oracle中的手工提交的,如果修改错了数据还可以Rollback.但在SQL Server ...