[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}\)有多少个满足上述约束条件 的子集。

输入样例#1: 
4

 
输出样例#1: 
8
样例解释
有8 个集合满足要求,
分别是空集,\({1},{1,4},{2},{2,3},{3},{3,4},{4}\)。
 
很妙的一道题。
不妨把2的倍数写作一行,3的倍数写作一列。
比如下面这个矩阵

\begin{bmatrix}
&1 &2 &4 &8 \;\;\\
&3 &6 &12 &24 \;\;\\
&9 &18 &36 &72 \;\;
\end{bmatrix}

可以发现,一行的元素数和列数都不会超过\(\log n\)
因此,考虑状压行\列来\(DP\)
 
如果这个矩阵中没有涉及到的元素呢?
重新新设一个矩阵来\(DP\)
 
补充两个数:
\(\log_{2} n = 18\)
\(\log_{3} n = 11\)
最终复杂度为\(O(2^{22}*18)\)(可能不准确)
 
注意:
状压的那一维一定是3的倍数的那一维,否则复杂度将退化至\(O(11*2^{36})\)(喜闻乐见的我)
模数是\(10^{9}+1\),不要打错(没错,又是我)
 
#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的更多相关文章

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

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

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

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

  3. 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...

  4. $HNOI2012\ $ 集合选数 状压$dp$

    \(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...

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

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

  6. 【BZOJ-2732】集合选数 状压DP (思路题)

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1070  Solved: 623[Submit][Statu ...

  7. 【BZOJ-2734】集合选数 状压DP (思路题)

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1070  Solved: 623[Submit][Statu ...

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

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

  9. 2734: [HNOI2012]集合选数

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

随机推荐

  1. 【BZOJ】2599: [IOI2011]Race 点分治

    [题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...

  2. 【BZOJ】3495: PA2010 Riddle 2-SAT算法

    [题意]有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都.n,m,k<=10^6. [算法]2-SAT,前后缀优化建图 [题解] ...

  3. MQTT协议及推送服务(二)

    MQTT简介 MQTT全称叫做Message Queuing Telemetry Transport,意为消息队列遥测传输,是IBM开发的一个即时通讯协议.由于其维护一个长连接以轻量级低消耗著称,所以 ...

  4. 我的Mac使用笔记

    此篇记录mac使用相关的一些东西,不断更新中... 1.Mac 安装homebrew : https://brew.sh/index_zh-cn.html /usr/bin/ruby -e " ...

  5. route add提示: "SIOCADDRT: No such process

    解决方法如下: 原因: There are multiple known causes for this error: - You attempted to set a route specific ...

  6. 实现在点击asp:button按钮后,不刷新当前页面

    方法1:return false <asp:Button ID="Button1" runat="server" Text="Button&qu ...

  7. vundle+vim8+php+xdebug

    vundle 一开始容易被坑,vundle的运行方法是自己下载,不是自己下载,在安装上vundle后,直接修改~/.vimrc中,Plugin增加插件,然后运行PluginInstall即可安装 vi ...

  8. 2017 SWERC

    2017 SWERC A:Cakey McCakeFace 题目描述:有一个炉每次只能放一个蛋糕,炉的进口和出口各放了一个探测器,当放蛋糕进去时,进口的探测器会记录时刻,当蛋糕做好后,蛋糕从出口出来, ...

  9. 转:google测试分享-SET和TE

    原文:  http://blog.sina.com.cn/s/blog_6cf812be0102vbnb.html 前端时间看了google测试之道,收获了一些,在此总结下并打算写一个系列blog,顺 ...

  10. U3D的一些常用基础脚本

    修改渲染颜色和贴图 1: var texture :Texture ; 2:  3: function Start () { 4: renderer.material.mainTexture = te ...