【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。利用乘法原理计算贡献,易证一个数字有且仅有在一个矩阵中出现,所以这样就可以打成补充不漏的效果。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 #include<cstdlib> 6 #include<cmath> 7 #include<cstring> 8 using namespace std; 9 #define maxn 1001000 10 #define llg long long 11 #define md 1000000001 12 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); 13 llg n,m,N,ans,flag[maxn]; 14 llg val[110][110],f[2][(1<<12)]; 15 llg work(llg S) 16 { 17 memset(val,0,sizeof(val)); 18 n=m=0; 19 flag[S]=1; 20 llg x=S; 21 val[0][0]=S; 22 while (x*2<=N) {n++; val[n][0]=val[n-1][0]*2; flag[val[n][0]]=1; x*=2; } 23 x=S; 24 while (x*3<=N) {m++; val[0][m]=val[0][m-1]*3; flag[val[0][m]]=1; x*=3;} 25 for (llg i=1;i<=n;i++) 26 for (llg j=1;j<=m;j++) 27 { 28 if (val[i][j-1]*3>N) break; 29 val[i][j]=val[i][j-1]*3; 30 flag[val[i][j]]=1; 31 } 32 llg la=0,now; 33 memset(f,0,sizeof(f)); 34 f[la][0]=1; 35 for (llg i=0;i<=n;i++) 36 for (llg j=0;j<=m;j++) 37 { 38 now=la^1; 39 memset(f[now],0,sizeof(f[now])); 40 for (llg zt=0;zt<=(1<<(m+1));zt++) 41 if (f[la][zt]!=0) 42 { 43 llg nzt=zt; 44 f[la][zt]%=md; 45 if (nzt&(1<<j)) nzt-=(1<<j); 46 f[now][nzt]+=f[la][zt]; 47 if ((val[i][j]==0) || (zt&(1<<j))) continue; 48 if (j!=0) 49 { 50 if (zt&(1<<(j-1))) continue; 51 } 52 nzt=zt; 53 nzt|=(1<<j); 54 f[now][nzt]+=f[la][zt]; 55 } 56 la=now; 57 } 58 llg tot=0; 59 for (llg i=0;i<=(1<<(m+1));i++) tot+=f[now][i]; 60 tot%=md; 61 return tot; 62 } 63 64 int main() 65 { 66 yyj("a"); 67 cin>>N; 68 ans=1; 69 for (llg i=1;i<=N;i++) 70 if (!flag[i]) 71 { 72 ans*=work(i); 73 ans%=md; 74 } 75 cout<<ans; 76 return 0; 77 }
转载于:https://www.cnblogs.com/Dragon-Light/p/6395335.html
【BZOJ】2734: [HNOI2012]集合选数相关推荐
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
- [HNOI2012]集合选数(思维构造 + 状压dp)
problem 题目链接 solution 从最小一个数 xxx 开始,将其 2x,3x2x,3x2x,3x 放入,再将 2(2x),3(2x),2(3x),3(3x)2(2x),3(2x),2(3x ...
- [HNOI2012]集合选数 BZOJ2734
分析: 构造法...每次找到一个没有被选过的数,用这个数推出一个表格,之后在表格上跑状压DP,时间复杂度O(n) 附上代码: #include <cstdio> #include < ...
- BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)
BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演) 手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/ ...
- [BZOJ 2734] 集合选数
Link: BZOJ 2734 传送门 Solution: 真是奥妙重重的建模啊..... 我们发现$x,2*x,3*x$这些数太分散了,难以处理 于是我们构建这样的表格: x 3x 9x 27 ...
- [转载] DeepinC . Mr_zkt 集合选数
我不生产代码,我只是题解的搬运工...(%DeepinC %Mr_zkt) 题干: 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交 ...
- P3226-[HNOI2012]集合选数【状压dp】
正题 题目链接:https://www.luogu.com.cn/problem/P3226 题目大意 1∼n1\sim n1∼n选出一些组成集合,一个集合里如果有xxx则不能有2x,3x2x,3x2 ...
- BZOJ3930: [CQOI2015]选数
BZOJ3930: [CQOI2015]选数 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案. 小z很好奇这样选出的数的最大公约数的规 ...
- 洛谷 P1036 选数
P1036 选数 题目描述 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别 ...
最新文章
- CenterNet KeyPoints 关键点训练自己的数据
- Android 控件 之 Menu 菜单
- anaconda创建一个虚拟环境
- 七分结构三分代码-直立车想节能
- sqlite性能优化
- DOM全屏Api requestFullscreen
- mybatis 使用in 查询时报错_不会Mybatis?一文教你手写实现Mybatis(超详细),吊打面试官!...
- Maven-依赖调解/查看项目依赖了哪些包
- 西电Pintos操作系统课程设计 实验三
- 使用Gpu恢复7z密码
- Mac上如何提取解压pkg文件
- 视觉三维重建核心算法讲解和代码实现(sfm构建稀疏地图和mvs构建稠密地图)...
- PS--用法/快捷键
- 【Word文稿】在Word中优雅地插入VScode颜色主题代码(高亮、背景、颜色、字体均完美)
- 如何在Android TV 桌面添加自定义频道/节目
- 大学四年,我做过哪些兼职
- RAC环境scan ip详解
- OGNL中#、%和$的用法
- 线缆种类小结:BNC、RJ45和RJ48
- Flutter学习第十四天:Flutter类似于淘宝的首页照片墙功能,让你的界面更加美观灵活?
热门文章
- Apache2.4.x下proxy_module、proxy_fcgi_module结合PHP-FPM解决内存不足问题
- 区块链的安全软肋是什么?
- 适合初学者的数据结构_数据结构101:数组-初学者的直观介绍
- Python中if语句练习题
- CSP 201812-2 小明放学 Python实现+详解
- UI培训分享:如何提升自己的UI设计能力
- 什么是Hive?它有哪些特点和特性?
- 女生零基础学软件测试难不难
- 阿里云双12服务器和阿里云双12数据库活动又开始了
- 让Ubuntu拥有SUSE一样的GRUB启动界面