Description

《集合论与图论》这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中。同学们不喜欢这种具有枚举性 质的题目,于是把它变成了以下问题:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足上述约束条件的子集的个数(只需输出对 1,000,000,001 取模的结果),现在这个问题就 交给你了。

Input

只有一行,其中有一个正整数 n,30%的数据满足 n≤20。

Output

仅包含一个正整数,表示{1, 2,..., n}有多少个满足上述约束条件 的子集。

Sample Input

4

Sample Output

8

【样例解释】

有8 个集合满足要求,分别是空集,{1},{1,4},{2},{2,3},{3},{3,4},{4}。

 
题解:
Orz hzwer
链接:http://hzwer.com/5149.html
code:
 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 100005
#define mod 1000000001
using namespace std;
typedef long long int64;
char ch;
bool ok;
void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
int n,m,list[],cnt,sta[];
bool bo[maxn];
int64 f[][],ans;
bool check(int s){
int last=;
for (;s;s>>=)
if (s&){if (last) return false;else last=;}
else last=;
return true;
}
void prepare(){
m=(int)ceil((log(n)/log()));
for (int i=;i<(<<m);i++) if (check(i)) sta[++cnt]=i;
}
int64 calc(int st){
memset(list,,sizeof(list));
int lim,dep,last; list[]=st,bo[st]=;
for (lim=;1LL*list[lim-]*<=n;lim++) list[lim]=list[lim-]*,bo[list[lim]]=;
memset(f,,sizeof(f));
for (int i=;i<=cnt;i++){
int s1=sta[i];
if (s1>=(<<lim)) break;
f[][s1]=;
}
last=lim;
for (lim=;1LL*list[lim]*<=n&&list[lim];lim++) list[lim]*=,bo[list[lim]]=;
for (dep=;lim;){
dep++;
for (int i=;i<=cnt;i++){
int s1=sta[i];
if (s1>=(<<last)) break;
for (int j=;j<=cnt;j++){
int s2=sta[j];
if (s2>=(<<lim)) break;
if (s1&s2) continue;
f[dep][s2]+=f[dep-][s1],f[dep][s2]%=mod;
}
}
last=lim;
for (lim=;1LL*list[lim]*<=n&&list[lim];lim++) list[lim]*=,bo[list[lim]]=;
}
int64 ans=;
for (int i=;i<(<<last);i++) ans+=f[dep][i],ans%=mod;
return ans;
}
int main(){
read(n),prepare(),ans=;
for (int i=;i<=n;i++) if (!bo[i]) ans=ans*calc(i)%mod;
printf("%lld\n",ans);
return ;
}

bzoj2734: [HNOI2012]集合选数的更多相关文章

  1. BZOJ2734 HNOI2012集合选数(状压dp)

    完全想不到的第一步是构造一个矩阵,使得每行构成公比为3的等比数列,每列构成公比为2的等比数列.显然矩阵左上角的数决定了这个矩阵,只要其取遍所有既不被2也不被3整除的数那么所得矩阵的并就是所有的数了,并 ...

  2. [BZOJ2734][HNOI2012] 集合选数(状态压缩+思维)

    Description 题目链接 Solution 可以根据条件构造出一个矩阵, 1 3 9 27 81... 2 6 18.... 4 12 36... 这个矩阵满足\(G[i][1]=G[i-1] ...

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

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

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

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

  5. 2734: [HNOI2012]集合选数

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

  6. [HNOI2012]集合选数 --- 状压DP

    [HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x ...

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

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

  8. [HNOI2012]集合选数 BZOJ2734

    分析: 构造法...每次找到一个没有被选过的数,用这个数推出一个表格,之后在表格上跑状压DP,时间复杂度O(n) 附上代码: #include <cstdio> #include < ...

  9. bzoj2734:[HNOI2012]集合选数(状压DP)

    菜菜的喵喵题~ 化序列为矩阵!化腐朽为神奇!左上角为1,往右每次*3,往下每次*2,这样子就把问题转化成了在矩阵里选不相邻的数有几种可能. 举个矩阵的例子 1 3 9 27 2 6 18 54 4 1 ...

随机推荐

  1. C#中HashTable的用法示例2

    命名空间 System.Collections 名称 哈希表(Hashtable) 描述 用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用 ...

  2. ecshop格式化商品价格

    <?php /** * 格式化商品价格 * * @access public * @param float $price 商品价格 * @return string */ function pr ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(5)-EF增删改查by糟糕的代码

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(5)-EF增删改查by糟糕的代码 上一讲我们创建了一系列的解决方案,我们通过一个例子来看看层与层之间的关系 ...

  4. Netty4具体解释二:开发第一个Netty应用程序

        既然是入门,那我们就在这里写一个简单的Demo,client发送一个字符串到server端,server端接收字符串后再发送回client. 2.1.配置开发环境 1.安装JDK 2.去官网下 ...

  5. 使用 Xcode 和 Android Studio 管理 iOS 和 Android 项目版本

    在移动应用开发和运营的过程中,版本管理是一个老生常谈的基础问题,一些版本的基本概念也常常会困扰我们的研发和运营人员.同时,手动管理软件版本,也常常会因为不小心导致后续的发布和更新问题. 这里,我准备了 ...

  6. css 权威指南笔记( 六)-基本视觉格式化

    块级元素 百分数:边框的宽度不能是百分数,只能是长度.基本原则是只使用百分数将无法创建完全灵活的元素布局(即所有属性都可设置). 合并垂直外边距 相邻外边距会沿着竖轴合并.两个外边距中较小的一个会被较 ...

  7. 【Android】退出运行了多个Activity的应用

    日常开发APP的时候,绝大多数情况下会有多个Activity,而finish()方法只能结束掉一个Activity,那么,我们可以通过什么方法去退出整个Application呢? 根据各大牛的经验,有 ...

  8. 开始android博客分享

    现在开始写博客,分享android开发中的心得.

  9. Linux 目录与文件的基本操作

    1 目录与文件 1.1 文件 硬盘中的数据在操作系统中的体现为文件. 1.2 目录 目录的概念不是文件集合.目录和文件一样,目录也是文件.目录是找到文件的“踏板”.目录的本质是路径映射. 1.3 Li ...

  10. vs中debug和release版本的区别(转)

    vs中的程序有debug和release两个版本,Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力.而Rel ...