【BZOJ】2734: [HNOI2012]集合选数
题目链接: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]集合选数的更多相关文章
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
- bzoj 2734: [HNOI2012]集合选数
题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中. 同学们不喜 ...
- 【刷题】BZOJ 2734 [HNOI2012]集合选数
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
- BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]
传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...
- bzoj 2734 [HNOI2012]集合选数 状压DP+预处理
这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #inclu ...
- 2734: [HNOI2012]集合选数
2734: [HNOI2012]集合选数 链接 分析: 转化一下题意. 1 3 9 27... 2 6 18 54... 4 12 36 108... 8 24 72 216... ... 写成这样的 ...
- 2734: [HNOI2012]集合选数 - BZOJ
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...
- BZOJ_2734_[HNOI2012]集合选数_构造+状压DP
BZOJ_2734_[HNOI2012]集合选数_构造+状压DP 题意:<集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x ...
随机推荐
- 实例,C# 导出.dbf格式文件
using System; using System.Collections using System.Configuration; using System.Data; using System. ...
- Linux 卸载 MySQL 数据库
1. 使用以下命令查看当前安装mysql情况 rpm -qa|grep -i mysql 显示之前安装过的数据库 2. 停止mysql服务.删除之前安装的mysql 删除命令: rpm -ev 包名若 ...
- Spring Boot 实现RESTful webservice服务端示例
1.Spring Boot configurations application.yml spring: profiles: active: dev mvc: favicon: enabled: fa ...
- maven 项目 查询部分关心的字段
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- HFA and outhandler differentiate or not
better trouble shooting auto-open accidently? HFA not stable? check code modification ASAP!!!
- 判断PC或mobile设备
js 限制: <script type="text/javascript"> function uaredirect(f){try{if(document.getEle ...
- spring使用@Autowired为抽象父类注入依赖
有时候为了管理或者避免不一致性,希望具体服务统一继承抽象父类,同时使用@Autowired为抽象父类注入依赖.搜了了网上,有些解决方法实现实在不敢恭维,靠子类去注入依赖,那还有什么意义,如下: 父类: ...
- mybatis generator 生成中文注释
mybatis generator默认生成 的注释太奇葩了,完全不能拿到生产去用,不过幸亏提供了接口可以自己扩展.长话短说,要生成如下的domain, package com.demo.domain; ...
- 02: CMDB设计思路
1.1 cmdb理解 参考博客:https://www.cnblogs.com/laowenBlog/p/6825420.html 参考博客2:https://www.cnblogs.com/ ...
- Eclipse中手动清理项目缓存,
用过Eclipse或MyEclipse的小伙伴肯定遇到过这种情况: 代码出错后,在前台访问出问题.然后把代码改好,已经检查不到错误,可是项目在前台访问还是有问题. 这个时候,可能就是Eclipse/M ...