[HNOI2012]集合选数 --- 状压DP
[HNOI2012]集合选数
题目描述
《集合论与图论》这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中。
同学们不喜欢这种具有枚举性 质的题目,于是把它变成了以下问题:对于任意一个正整数,
如何求出\({1,2,3...n}\) 的满足上述约束条件的子集的个数(只需输出对 \(10^{9}+1\) 取模的结果),现在这个问题就交给你了。
输入格式:
只有一行,其中有一个正整数 \(n\)
30%的数据满足 \(n<=20\)。
100%数据满足 \(n<=100000\)。
输出格式:
仅包含一个正整数,表示\({1, 2,..., n}\)有多少个满足上述约束条件 的子集。
\begin{bmatrix}
&1 &2 &4 &8 \;\;\\
&3 &6 &12 &24 \;\;\\
&9 &18 &36 &72 \;\;
\end{bmatrix}
#include <cstdio>
#include <cstring>
#include <bitset>
#define mod (100000001)
#define sid 200050
#define ri register int
using namespace std; inline void up(int &x, int y) {
x += y; if(x >= mod) x -= mod;
} inline void mu(int &x, int y) {
long long tmp = (1ll * x * y) % mod;
x = (int)tmp;
} int n;
bitset <> flag;
int num[][], lim[], bit[];
int dp[][sid], ans = ; inline int Solve(int kp) {
memset(num, , sizeof(num));
num[][] = kp;
for(ri i = ; i <= ; i ++) lim[i] = ;
for(ri i = ; i <= ; i ++)
if(num[][i - ] * <= n) num[][i] = num[][i - ] * ;
for(ri i = ; i <= ; i ++) {
if(num[i - ][] * > n) break;
num[i][] = num[i - ][] * ;
for(ri j = ; j <= ; j ++)
if(num[i][j - ] * <= n) num[i][j] = num[i][j - ] * ;
}
for(ri i = ; i <= ; i ++)
for(ri j = ; j <= ; j ++)
if(num[i][j]) lim[i] |= bit[j - ], flag[num[i][j]] = ;
for(ri i = ; i <= ; i ++)
for(ri j = ; j <= lim[i]; j ++) dp[i][j] = ;
dp[][] = ;
for(ri i = ; i <= ; i ++)
for(ri j = ; j <= lim[i - ]; j ++)
if(dp[i - ][j])
for(ri k = ; k <= lim[i]; k ++)
if((k & (k >> )) == && (j & k) == )
up(dp[i][k], dp[i - ][j]);
return dp[][];
} inline void DP() {
for(ri i = ; i <= ; i ++) bit[i] = << i;
for(ri i = ; i <= n; i ++) if(!flag[i]) mu(ans, Solve(i));
printf("%d\n", ans);
} int main() {
scanf("%d", &n);
DP();
return ;
}
sad
[HNOI2012]集合选数 --- 状压DP的更多相关文章
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
- 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...
- $HNOI2012\ $ 集合选数 状压$dp$
\(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...
- bzoj 2734 [HNOI2012]集合选数 状压DP+预处理
这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #inclu ...
- 【BZOJ-2732】集合选数 状压DP (思路题)
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ...
- 【BZOJ-2734】集合选数 状压DP (思路题)
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ...
- BZOJ_2734_[HNOI2012]集合选数_构造+状压DP
BZOJ_2734_[HNOI2012]集合选数_构造+状压DP 题意:<集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x ...
- 2734: [HNOI2012]集合选数
2734: [HNOI2012]集合选数 链接 分析: 转化一下题意. 1 3 9 27... 2 6 18 54... 4 12 36 108... 8 24 72 216... ... 写成这样的 ...
随机推荐
- 51nod 1161 Partial Sums
给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}.如果对生成的数组S再进行一次累加操作,{1 ...
- 2017ACM暑期多校联合训练 - Team 6 1003 HDU 6098 Inversion (模拟)
题目链接 Problem Description Give an array A, the index starts from 1. Now we want to know Bi=maxi∤jAj , ...
- NYOJ 305 表达式求值 (字符串处理)
题目链接 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练, ...
- python初步学习-python文件操作
文件 文件,在python中,他是一种类型的对象,类似前面已经学过的其他数据类型,包括文本的.图片的.音频的.视频的等等,还有不少没见过的扩展名的.事实上,在linux操作系统中,所有的东西都被保存到 ...
- jQuery的validation插件(验证表单插件)
更完整的参考:http://www.runoob.com/jquery/jquery-plugin-validate.html 验证隐藏字段的使用(验证通过后ajax提交表单):http://www. ...
- springboot + swagger2 生成api文档
直接贴代码: <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-sw ...
- HTML+CSS图文排版
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- nodeJs 常用模块(一)
url url.parse() querystring querystring.parse( [string] , [分隔符] ) ,解析为js字面量 querystring.stringify() ...
- bitbucket SSH 生成
在bitbucket设置ssh的方法: 1.运行ssh-keygen. 2.一路enter,直接到结束. 3 seeting 中Bitbucket选择.ssh/id_rsa.pub文件
- day4 使用yield实现单线程
一.yield生成器(yield) yield用来结束while循环,并且能够保持之前循环的状态,下一次调用的时候直接从yield开始执行,执行yield后面的程序,并且重新进行循环:另外,yield ...