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. chrome如何添加扩展程序xss encode

    1.把相应格式(*.crx)的扩展程序直接拖入下面的界面即可(拖入浏览器的其他界面不行)

  2. PHP运行出现Notice : Use of undefined constant 的完美解决方案

    Notice: Use of undefined constant title - assumed 'title' in F:\wamp\www\load_myweb.php on line 22No ...

  3. android 50 进程优先级

    程序在磁盘叫程序,程序加载到内存运行起来叫进程,优先级5个级别,内存不足的时候会杀掉低级别进程. Active Process:最上面用户可以操作的. Visible Process:可见进程,部分可 ...

  4. 安装zookeeper时候,可以查看进程启动,但是状态显示报错:Error contacting service. It is probably not running

    安装zookeeper-3.3.2的时候,启动正常没报错,但zkServer.sh status查看状态的时候却出现错误,如下: JMX enabled by defaultUsing config: ...

  5. ORACLE解锁数据库用户

    the account is locked解决办法: 1.进入sqlplus sqlplus "/as sysdba" 2.解锁: alter user hpmng account ...

  6. java判断字符串是否为空的方法总结

    http://blog.csdn.net/qq799499343/article/details/8492672 以下是java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观 ...

  7. jdbc mysql - Column count doesn't match value count at row 1.

    该句的意思是,insert操作的SQL语句里列的数目和后面值的数目不一致.比如说, String sql = "insert into t_aqi(city_name, cur_date, ...

  8. nopi导入导出

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. PHP代码批量加密

    <?php error_reporting(E_ALL); ini_set('display_errors','1'); //批量加密码当前目录 $dirnow = getcwd(); $dir ...

  10. VS2010 Cstring to int

    今天遇到一个将Cstring转化为int的问题,用atoi(),发现不可以,找了一下原因. 原来因为在VS2015(2010)的版本中是UNICODE ,请使用这个函数 _ttoi() . CStri ...