2734: [HNOI2012]集合选数
2734: [HNOI2012]集合选数
分析:
转化一下题意。
1 3 9 27...
2 6 18 54...
4 12 36 108...
8 24 72 216...
...
写成这样的矩阵阵后,那么题意就是不能选相邻的点,求方案数。可以知道行不超过18,列不超过11,然后状压dp即可。
发现5在这个矩阵中没有出现,于是可以在构造a[1][1]=5的矩阵,利用乘法原理求出相乘。同样地,构成a[1][1]为没有出现的数的矩阵,相乘。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int mod = ; int a[][], b[], f[][], n;
bool vis[]; inline void add(int &x,int y) { x += y; if (x >= mod) x -= mod; }
int Calc(int x) {
memset(b, , sizeof(b));
a[][] = x;
for (int i = ; i <= ; ++i)
if ((a[i - ][] << ) <= n) a[i][] = a[i - ][] << ;
else a[i][] = n + ;
for (int i = ; i <= ; ++i)
for (int j = ; j <= ; ++j)
if (a[i][j - ] * <= n) a[i][j] = a[i][j - ] * ;
else a[i][j] = n + ;
for (int i = ; i <= ; ++i)
for (int j = ; j <= ; ++j)
if (a[i][j] <= n) b[i] += ( << (j - )), vis[a[i][j]] = ;
for (int i = ; i <= ; ++i)
for (int j = ; j <= b[i]; ++j) f[i][j] = ;
f[][] = ;
for (int i = ; i < ; ++i)
for (int s = ; s <= b[i]; ++s)
if (f[i][s])
for (int t = ; t <= b[i + ]; ++t)
if ((s & t) == && (t & (t >> )) == ) add(f[i + ][t], f[i][s]);
return f[][];
} int main() {
n = read(); LL ans = ;
for (int i = ; i <= n; ++i)
if (!vis[i]) ans = 1ll * ans * Calc(i) % mod;
cout << ans;
return ;
}
2734: [HNOI2012]集合选数的更多相关文章
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
- 2734: [HNOI2012]集合选数 - BZOJ
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...
- 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]集合选数
题目链接: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
BZOJ_2734_[HNOI2012]集合选数_构造+状压DP 题意:<集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x ...
随机推荐
- 简易使用UILabel的富文本
简易使用UILabel的富文本 使用效果: 源码: NSString+YX.h NSString+YX.m // // NSString+YX.h // YXKit // // Copyrigh ...
- 18年11月5日 NOIP模拟赛
T1 题解 对于k=100的情况,贪心 对于100%的数据 可以发现,当前的决策只对后面的开采有影响,且剩余耐久度与之后的开采收益成正比,如果倒着考虑这个问题,得出i-n的星球1点耐久度所能获得的最大 ...
- #001 CSS快速入门讲解
CSS入门讲解 HTML人+CSS衣服+JS动作=>DHTML CSS: 层叠样式表 CSS2.0 和 CSS3.0 版本,目前学习CSS2, CSS3只是多了一些样式出来而已 CSS 干啥用的 ...
- 纯css3云彩动画效果
效果描述: 纯CSS3实现的云彩动画飘动效果 非常逼真实用 使用方法: 1.将body中的代码部分拷贝到你的页面中 2.引入对应的CSS文件即可
- Bottle + WebUploader 修改Bottle框架从而大文件上传实现方案
Bottle 是个轻量级的Web框架,小巧又强大,真不愧是个轻量级的框架.可扩展性非常好,可以扩展很多功能,但是有些功能就不得不自己动手修改了. Bottle:http://www.bottlepy. ...
- SPOJ-SUBSET Balanced Cow Subsets
嘟嘟嘟spoj 嘟嘟嘟vjudge 嘟嘟嘟luogu 这个数据范围都能想到是折半搜索. 但具体怎么搜呢? 还得扣着方程模型来想:我们把题中的两个相等的集合分别叫做左边和右边,令序列前一半中放到左边的数 ...
- 20145203JAVA课程总结
20145203盖泽双 <Java程序设计>课程总结 课程总结 (按顺序)每周读书笔记链接汇总 调查问卷:http://www.cnblogs.com/GZSdeboke/p/524832 ...
- @SpringBootApplication无法被解析引入
问题描述:@SpringBootApplication无法被解析引入,导致SpringBoot启动类报错 原因分析:springboot的包冲突了所致 解决方案: 需要删掉 repository\or ...
- CCF认证201712-1最小差值
问题描述 给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值. 输入格式 输入第一行包含一个整数n. 第二行包含n个正整数,相邻整数之间使用一个空格分隔. 输出格式 输出一个 ...
- iOS 内存管理之属性关键字
你好2019!一起努力呀! 主要分三种类型: 1.原子操作相关: nonatomic.atomic nonatomic:非原子操作,对属性赋值的时候不加锁,多线程并发访问会提高访问效率 atomic: ...