题目传送门: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)的更多相关文章

  1. bzoj2734 集合选数

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

  2. 『数 变进制状压dp』

    数 Description 给定正整数n,m,问有多少个正整数满足: (1) 不含前导0: (2) 是m的倍数: (3) 可以通过重排列各个数位得到n. \(n\leq10^{20},m\leq100 ...

  3. 【思维题 状压dp】APC001F - XOR Tree

    可能算是道中规中矩的套路题吧…… Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...

  4. “景驰科技杯”2018年华南理工大学程序设计竞赛 A. 欧洲爆破(思维+期望+状压DP)

    题目链接:https://www.nowcoder.com/acm/contest/94/A 题意:在一个二维平面上有 n 个炸弹,每个炸弹有一个坐标和爆炸半径,引爆它之后在其半径范围内的炸弹也会爆炸 ...

  5. 骨牌摆放方案数n*m(状压DP)

    题意:https://www.nitacm.com/problem_show.php?pid=1378 如题. 思路: 从第一行for到最后一行,枚举每一行的所有状态,进行转移,注意答案是dp[最后一 ...

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

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

  7. POJ 1684 Corn Fields(状压dp)

    描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...

  8. BZOJ1087【状压DP】

    题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1087] 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击 ...

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

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

随机推荐

  1. 20165330 2017-2018-2 《Java程序设计》第4周学习总结

    课本知识总结 第五章 子类与继承 子类:在类的声明中,通过使用关键字extends来定义一个类的子类. class 子类名 extends 父类名 { ... } 继承:子类继承父类的成员变量作为自己 ...

  2. cocoapod 最新安装使用步骤

    cocoapod 最新安装使用步骤 安装 1.sudo gem update (2个-)system :更新你的gem system至最新 2.gem sources  (2个-)remove htt ...

  3. swift tableViewController

    tableViewController 控制器 import UIKit     class ViewController: UITableViewController {              ...

  4. null array mysqli_fetch_assoc ( mysqli_result $result ) void mysqli_free_result ( mysqli_result $result )

    w取最大db_id. if($row=null){ var_dump(123); } var_dump($row); if($rowb=array('ww','w123')){ var_dump(23 ...

  5. windows中根据进程PID查找进程对象过程深入分析

    这里windows和Linxu系列的PID 管理方式有所不同,windows中进程的PID和句柄没有本质区别,根据句柄索引对象和根据PID或者TID查找进程或者线程的步骤也是一样的.   句柄是针对进 ...

  6. 6.Git代码回滚

    1.代码修改并提交 我们已经成功地添加并提交了一个helloWorld.txt文件,现在,是时候继续工作了. 于是,我们继续修改helloWorld.txt文件,改成如下内容: $ vi helloW ...

  7. 一次因为文件名开头包含空格而导致FTP文件一直无法下载的悲剧!

    最近负责公司研究新的多渠道打包方案,之前的打包方案太慢了,因此采用了美团的Android Signature V2 Scheme签名下的新一代渠道包打包神器 方案进行了多渠道打包.但是由于马虎,在配置 ...

  8. SpringBoot安装和创建简单的Web应用

    SpringBoot安装 方式一: Eclipese->Help->Eclipse Marketplace ->Finde STS -> Install 注意:安装过程中挺慢, ...

  9. Android training–android studio

    又重新开始学习android开发了,希望这次不是三分钟热度.之前是利用eclipse+ADT来开发的,官网上建议用Android Studio.刚好重装了系统,升级了内存.于是下个studio来学学. ...

  10. Ubuntu 16.04 源码编译安装PHP7+swoole

    备注: Ubuntu 16.04 Server 版安装过程图文详解 Ubuntu16镜像地址: 链接:https://pan.baidu.com/s/1XTVS6BdwPPmSsF-cYF6B7Q 密 ...