#轮廓线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--\) \(--\) 不难发现,对于 ...
随机推荐
- pycharm中自定义函数补全
在 PyCharm 中,你可以通过以下步骤实现这一目标: 打开 PyCharm,点击顶部菜单的 "File"(文件) -> "Settings"(设置). ...
- abc模块的用法
首先需要了解的是一个基类(父类),abc.ABCMeta.这个是用于实现抽象类的一个基础类 抽象方法的使用,在相应的方法之前一行加上@abstractmethod之后,从新的一行开始定义相应的方法.实 ...
- 【Azure Developer】使用Azure Key Vault 的Key签名后,离线验证的一些参考资料
问题描述 使用 key Vault 的sign接口,Request Body中的 Value 是要传什么呢? 签名后的内容如何在本地离线验证呢? Azure Key Vault Sign 接口:htt ...
- C# 操作国产数据库之【 人大金仓 】之四大模式
人大金仓优点 人大金仓是国产最主流ORM之一 具有和PgSql一样强悍的性能,同时人大金仓支持了四种数据库模式 : Oracle.PgSql.MySql和SqlServer ,假如你们系统有多种数据库 ...
- C++ //常用查找算法 find //自定义类型需要重载 ==
1 //常用查找算法 find 2 #include<iostream> 3 #include<algorithm> 4 #include<functional> ...
- golang官方包管理vendor模式无法引用非go文件
主页 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ 背景&问题 golang作为高级计算机语言之一,在云原生以及web网站 ...
- Git修改最近一次提交的日志信息
一.问题由来 当前自己所在的项目组中,每次发完一个版本后,就需要创建个人新版本的git提交凭证,其实就是系统自动 生成的一串编码,如果没有这个凭证,代码是提交不了的,这是公司制定的开发规范之一.这两天 ...
- 发那科数控机床FanucCNC(NCGuide)仿真模拟器配置和数据采集测试
开发日记3.12 此篇用于记录发那科数控机床(Fanuc CNC)采集程序开发中,用虚拟机做测试时,虚拟机的配置和使用以支持采集软件开发和测试. 配置虚拟机使用仿真软件 下载VMware15 「链接: ...
- 单词本z launch = to throw 相关词根 lanc ject jac jet bol bl bal mit miss cast
launch = to throw 词根 launc = lanc = to throw 表示 to throw 的词根有三组 拉丁语的lanc/launc,sip 拉丁语的ject, jac(jet ...
- gcc makefile 模板
一 基本概况 在做基本的c代码测试的时候,经常会遇到gcc做编译,作为一个工程师,不存点模板,每次都是自己写的话,那不是非常的浪费体力,程序员本来就累了.在这上面浪费不少时间,吃力不讨好啊. 保存一些 ...