题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2734


考虑$N=4$的情况:

\begin{bmatrix}
1&3 &X \\
2&X &X \\
4&X &X
\end{bmatrix}

其实就是吧最小值丢在了矩阵中${(0,0)}$的位置上,对于矩阵中的任意位置令${f[i][j]=f[i][j-1]*3}$,${f[i][j]=f[i-1][j]*2}$。

这样一来问题就转换为了:在一个矩阵中选取任意多的数字使得没有两个相邻的数字被同时选取的方案数。这个就是经典的轮廓线DP模型。

但是我们注意到并不是一个矩阵就覆盖了所有的数字,所以我们需要记录哪些数字已经在矩阵中出现过了,从小到大枚举数字,对于还没有出现的数字再把它丢到${(0,0)}$的位置在构造一个矩阵并进行DP。利用乘法原理计算贡献,易证一个数字有且仅有在一个矩阵中出现,所以这样就可以打成补充不漏的效果。


 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 1001000
#define llg long long
#define md 1000000001
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,N,ans,flag[maxn];
llg val[][],f[][(<<)];
llg work(llg S)
{
memset(val,,sizeof(val));
n=m=;
flag[S]=;
llg x=S;
val[][]=S;
while (x*<=N) {n++; val[n][]=val[n-][]*; flag[val[n][]]=; x*=; }
x=S;
while (x*<=N) {m++; val[][m]=val[][m-]*; flag[val[][m]]=; x*=;}
for (llg i=;i<=n;i++)
for (llg j=;j<=m;j++)
{
if (val[i][j-]*>N) break;
val[i][j]=val[i][j-]*;
flag[val[i][j]]=;
}
llg la=,now;
memset(f,,sizeof(f));
f[la][]=;
for (llg i=;i<=n;i++)
for (llg j=;j<=m;j++)
{
now=la^;
memset(f[now],,sizeof(f[now]));
for (llg zt=;zt<=(<<(m+));zt++)
if (f[la][zt]!=)
{
llg nzt=zt;
f[la][zt]%=md;
if (nzt&(<<j)) nzt-=(<<j);
f[now][nzt]+=f[la][zt];
if ((val[i][j]==) || (zt&(<<j))) continue;
if (j!=)
{
if (zt&(<<(j-))) continue;
}
nzt=zt;
nzt|=(<<j);
f[now][nzt]+=f[la][zt];
}
la=now;
}
llg tot=;
for (llg i=;i<=(<<(m+));i++) tot+=f[now][i];
tot%=md;
return tot;
} int main()
{
yyj("a");
cin>>N;
ans=;
for (llg i=;i<=N;i++)
if (!flag[i])
{
ans*=work(i);
ans%=md;
}
cout<<ans;
return ;
}

【BZOJ】2734: [HNOI2012]集合选数的更多相关文章

  1. bzoj 2734: [HNOI2012]集合选数 状压DP

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 321[Submit][Status ...

  2. bzoj 2734: [HNOI2012]集合选数

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

  3. 【刷题】BZOJ 2734 [HNOI2012]集合选数

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

  4. BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...

  5. BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]

    传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...

  6. bzoj 2734 [HNOI2012]集合选数 状压DP+预处理

    这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #inclu ...

  7. 2734: [HNOI2012]集合选数

    2734: [HNOI2012]集合选数 链接 分析: 转化一下题意. 1 3 9 27... 2 6 18 54... 4 12 36 108... 8 24 72 216... ... 写成这样的 ...

  8. 2734: [HNOI2012]集合选数 - BZOJ

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

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

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

随机推荐

  1. 导弹拦截 p1020

    第一问就是求最长不上升子序列的长度,要写O(nlogn)的算法.... 对于这种nlogn的算法,只能求出长度,不能求出具体的序列.这种算法实现过程如下: 我们定义len为到目前为止最长不上升子序列的 ...

  2. 【react懒加载组件】--react-lazyload

    组件安装: npm install react-lazyload --save-dev 组件使用: //引入 import LazyLoad from 'react-lazyload'; //rend ...

  3. linux 搭建svn(待完成)

    http://blog.csdn.net/lazy_cc/article/details/8726500搭建仓库 http://blog.csdn.net/xocoder/article/detail ...

  4. thinkphp 检测验证码

    /** * 检测验证码 * @param integer $id 验证码ID * @return boolean 检测结果 */function check_verify($code, $id = 1 ...

  5. kivy中bind的使用

    一般在kivy中使用bind()来绑定回调函数,所谓回调函数,个人理解就是一个预先定义好的方法, 因为APP是静态的, 需要等待用户进行操作, 特定的操作背后都绑定了特定的回调函数, 一般有两种类型: ...

  6. oracle /*+ SYS_DL_CURSOR */ 这个hint

    之前一直都没使用过 /*+ SYS_DL_CURSOR */这个提示,今天下午在排查一个性能问题的时候,发现出问题的session在执行一个带了SYS_DL_CURSOR提示的语句,类似于: 经查这个 ...

  7. ldap集成grafana

    grafana版本: 5.0.3 grafana通过k8s方式安装,所以需将配置文件挂载过去. cat grafana-configmap.yaml apiVersion: v1 kind: Conf ...

  8. js的匿名函数 和普通函数

    匿名函数在声明时不用带上函数名, 可以把匿名函数当作一个function类型的值来对待 声明一个普通的函数 function func() { ... } 可以认为和var func = functi ...

  9. php 常用代码片断

    参考: https://www.jianshu.com/p/f5303225ef92 http://www.phpxs.com/code/php/

  10. 20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

    20155201 李卓雯 <网络对抗技术>实验一 逆向及Bof基础 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,f ...