#轮廓线dp,模型转换#洛谷 3226 [HNOI2012]集合选数
题目
问有多少个集合 \(S\) 是 \([1,n]\) 的子集,
并且 \(\forall a,b\in S,a|b\),满足 \(\frac{b}{a}\neq \{2,3\}\)
分析
可以发现这样所谓的独立集,不满足的关系近似于 若干个网格图 ,即
| 1 | 3 | 9 | ... |
| 2 | 6 | 18 | ... |
| 4 | 12 | 36 | ... |
| ... | ... | ... | ... |
也就是相邻的不能选,可以发现直接状压dp就可以了,
然后表格左上角以 \(6i+1\) 和 \(6i+5\) 数开始即可
代码
#include <cstdio>
#include <cstring>
using namespace std;
const int N=2101,mod=1000000001;
int a[18][11],l[18],f[N],dp[N],n,al,two[18],tot[18],TOT,rk[N],b[N],ans=1;
int mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
int answ(int m){
if (n/m<3) return n/m+1;
int k=1,ans=0; a[1][l[k]=1]=m;
while (1){
while (a[k][l[k]]*3<=n) ++l[k],a[k][l[k]]=a[k][l[k]-1]*3;
if (a[k][1]*2<=n) l[++k]=1,a[k][1]=a[k-1][1]*2;
else break;
}
memset(dp,0,sizeof(dp)),
memset(f,0,sizeof(f)),
l[0]=l[1],dp[1]=1;
for (int i=1;i<=k;++i){
int now=0;
for (int j=l[i];j<l[i-1];++j) now|=two[j];
for (int j=1;j<=tot[l[i-1]];++j){
int t0=rk[b[j]&(al^1)],t1=rk[b[j]|1];
if (!(b[j]&1)) f[j]=mo(dp[t0],dp[t1]);
else if (!(now&1)) f[j]=dp[t0];
else f[j]=0;
}
memcpy(dp,f,(tot[l[i-1]]+1)<<2);
for (int o=1;o<l[i-1];++o){
for (int j=1;j<=tot[l[i-1]];++j){
int t0=rk[b[j]&(al^two[o])],t1=rk[b[j]|two[o]];
if (!((b[j]>>o)&1)) f[j]=mo(dp[t0],dp[t1]);
else if (!((b[j]>>(o-1))&1)&&!(now&1)) f[j]=dp[t0];
else f[j]=0;
}
memcpy(dp,f,(tot[l[i-1]]+1)<<2);
}
}
for (int i=1;i<=tot[l[k]];++i) ans=mo(ans,dp[i]);
return ans;
}
int main(){
scanf("%d",&n),two[0]=rk[0]=TOT=1,al=2047;
for (int i=1;i<12;++i) two[i]=two[i-1]<<1;
for (int j=1;j<12;++j){
for (int i=two[j-1];i<two[j];++i){
int now=i&(i<<1);
if (!(now&(now-1))) b[++TOT]=i,rk[i]=TOT;
}
tot[j]=TOT;
}
for (int i=0;i<=n;++i){
if (6*i+1<=n) ans=1ll*ans*answ(6*i+1)%mod;
else break;
if (6*i+5<=n) ans=1ll*ans*answ(6*i+5)%mod;
else break;
}
return !printf("%d",ans);
}
#轮廓线dp,模型转换#洛谷 3226 [HNOI2012]集合选数的更多相关文章
- BZOJ 2734 洛谷 3226 [HNOI2012]集合选数【状压DP】【思维题】
[题解] 思维题,看了别人的博客才会写. 写出这样的矩阵: 1,3,9,... 2,6,18,... 4,12.36,... 8,24,72,... 我们要做的就是从矩阵中选出一些数字,但是不能选相邻 ...
- 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...
- 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 ...
- [HNOI2012]集合选数 --- 状压DP
[HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x ...
- 2734: [HNOI2012]集合选数
2734: [HNOI2012]集合选数 链接 分析: 转化一下题意. 1 3 9 27... 2 6 18 54... 4 12 36 108... 8 24 72 216... ... 写成这样的 ...
- 【BZOJ】2734: [HNOI2012]集合选数
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2734 考虑$N=4$的情况: \begin{bmatrix} 1&3 &X ...
- bzoj 2734 [HNOI2012]集合选数 状压DP+预处理
这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #inclu ...
- BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]
传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...
- [HNOI2012]集合选数(状压DP+构造)
题目要求若出现x,则不能出现2x,3x 所以我们考虑构造一个矩阵 \(1\ 2\ 4 \ 8--\) \(3\ 6\ 12\ 24--\) \(9\ 18\ 36--\) \(--\) 不难发现,对于 ...
随机推荐
- win32 - 将剪贴板位图存储为文件
简单的demo: #include <iostream> #include <fstream> #include <windows.h> typedef struc ...
- SQL Server初体验
概述 基于SQL Server 2019 Developer免费版搭建一个本地的开发环境. 下载安装 安装文件下载地址:https://www.microsoft.com/zh-cn/sql-serv ...
- ZYNQ SD卡 CDn管脚的作用
## 什么 是CDn? card detect, active low,用于指示当前SD卡是否插入,主机通过检测CD脚的状态来识别当前SD卡的状态. CD可以连接到MIO或者EMIO的任意空闲管脚,通 ...
- 【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
问题描述 PHP的Web Job,通过artisan来配置路径启动PHP任务,相关启动脚本如下: artisan_path = "d:\\home\\site\\wwwroot"; ...
- 【Azure 环境】当本地网络通过ER专线与Azure云上多个虚拟网络打通,如何通过特定的网络策略来限制本地部分网段访问云上虚拟机22端口?
问题描述 当本地网络通过ER专线与Azure云上多个虚拟网络打通,如何通过特定的网络策略来限制本地部分网段访问云上虚拟机22端口? 问题回答 根据文档调研,在ER线路服务的层面,是无法做网络策略来限制 ...
- 连接微信群、Slack 和 GitHub:社区开放沟通的基础设施搭建
NebulaGraph 社区如何构建工具让 Slack.WeChat 中宝贵的群聊讨论同步到公共领域. 要开放,不要封闭 在开源社区中,开放的一个重要意义是社区内的沟通.讨论应该是透明.包容并且方便所 ...
- BeanShell Sample 如何使用?
一 引入: eanShell Sample主要用于生成一些逻辑复杂的数据,例如用于加解密数据: **每次调用前重置bsh.Interpreter:每个BeanShell副本都有自己的解释器副本(每个线 ...
- For 循环跟yield区别?
for循环遍历一个万亿级别的长列表,会将这个列表的全部数据载入到内存中去,如果你的内存很小就会溢出,即使是内存很大,这个操作也是十分占用资源的. 而使用生成器,则会将数据的状态(例如:遍历到列表的哪个 ...
- Landsat 7的热红外波段有2个该如何选择?
本文介绍Landsat 7遥感影像数据中B61.B62两个热红外波段的区别,以及研究应用时二者选择的依据. Landsat 7遥感影像数据具有2个热红外波段,分别是Band 61与Band 6 ...
- npm install 的执行顺序,和 安装包的源死磕
npm install 源的地址加载执行顺序 从近到远 lock文件 这里直接就记录了 包的下载地址 .npmrc 里面的内容 registry=http://registry.npm.xxxx.co ...