题目描述

《集合论与图论》这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中。

同学们不喜欢这种具有枚举性 质的题目,于是把它变成了以下问题:对于任意一个正整数 n<=100000,如何求出{1, 2,..., n} 的满足上述约束条件的子集的个数(只需输出对 1,000,000,001 取模的结果),现在这个问题就 交给你了。

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:
复制
输出样例#1: 复制
每个k(不含2,3的因数)可以单独考虑,答案是所有k方案的积
即考虑$k*2^i*3^j<=n$的方案
构造一个矩阵:
 k   3k  9k  27k
2k  6k  18k  54k
4k 12k  36k 108k
令f[i][S]表示当前选到2^i,行状态为S
S第j位为1表示选了2^i*3^j
首先根据题意,S相邻2位不能为1
然后转移时前面的状态S'
要满足与S&S'=0
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,Log2[],Log3[],pw2[],pw3[];
int ans,Mod=1e9+,f[][],s[],cnt,p,q,sum;
int main()
{int i,j,k,l;
cin>>n;
Log2[]=;
for (i=;i<=n;i++)
Log2[i]=Log2[i/]+;
Log3[]=;
for (i=;i<=n;i++)
Log3[i]=Log3[i/]+;
pw2[]=;
for (i=;i<=;i++)
pw2[i]=pw2[i-]*;
pw3[]=;
for (i=;i<=;i++)
pw3[i]=pw3[i-]*;
for (i=;i<pw2[];i++)
{
s[i]=;
for (j=;j<=;j++)
if ((i&pw2[j])&&(i&pw2[j+])) s[i]=;
}
ans=;
for (i=;i<=n;i++)
if (i%&&i%)
{
k=;
q=Log3[n/i]+;
for (j=;j<pw2[q];j++)
f[][j]=s[j];
while (i*pw2[k]<=n)
{
p=Log3[n/(i*pw2[k])]+;
for (j=;j<pw2[p];j++)
if (s[j])
{
f[k][j]=;
for (l=;l<pw2[q];l++)
if (s[l]&&((j&l)==))
{
f[k][j]=(f[k][j]+f[k-][l])%Mod;
}
}
else f[k][j]=;
q=p;
k++;
}
sum=;
for (j=;j<pw2[q];j++)
sum=(sum+f[k-][j])%Mod;
ans=(1ll*ans*sum)%Mod;
}
cout<<ans;
}

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

  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

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

  3. 2734: [HNOI2012]集合选数

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

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

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

  5. 2734: [HNOI2012]集合选数 - BZOJ

    Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...

  6. bzoj 2734: [HNOI2012]集合选数

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

  7. 【刷题】BZOJ 2734 [HNOI2012]集合选数

    Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...

  8. BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]

    传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...

  9. [HNOI2012]集合选数(状压DP+构造)

    题目要求若出现x,则不能出现2x,3x 所以我们考虑构造一个矩阵 \(1\ 2\ 4 \ 8--\) \(3\ 6\ 12\ 24--\) \(9\ 18\ 36--\) \(--\) 不难发现,对于 ...

随机推荐

  1. Python处理图片缩略图

    CPU 密集型任务和 IO 密集型任务分别选择多进程multiprocessing.Pool.map 和多线程库multiprocessing.dummy.Pool.map import os imp ...

  2. 关于FPGA随笔

    verilog与c

  3. Java 后端微信小程序支付demo (网上说的坑里面基本上都有)

    Java 后端微信小程序支付 一.遇到的问题 1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试 2.签名错误 3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候 ...

  4. 09-移动端开发教程-Sass入门

    1. 引言 CSS3之前的CSS都大都是枚举属性样式,而编程语言强大的变量.函数.循环.分支等功能基本都不能在CSS中使用,让CSS的编程黯淡无光,Sass就是一种增强CSS编程的扩展语言(CSS4也 ...

  5. css的内容

    块级元素和行内元素的区别: 1. 行内元素部不能够设置宽度和高度.行内元素的宽度和高度是标签内容的宽度和高度.块级元素可以设置宽度和高度. 2. 块级元素会独占一行.而行内元素却部能够独占一行,只能和 ...

  6. Python struct模块

    有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...

  7. python小练习之二

    title: python小练习之二 tags: 新建,模板,小书匠 grammar_cjkRuby: true --- python小练习之二 需求:实现用户登录,用户名和密码保存到文件里,连续输入 ...

  8. c 语言常量

    1,整数常量 整数常量可以是十进制.八进制或十六进制的常量.前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制. 整数常量也可以带一个后缀,后缀是 U 和 L 的组合 ...

  9. WPF 自定义DataGrid控件样式

    内容转自https://www.cnblogs.com/xiaogangqq123/archive/2012/05/07/2487166.html 一.DataGrid基本样式(一) 小刚已经把Dat ...

  10. spring MVC框架入门(外加SSM整合)

    spring MVC框架 一.什么是sping MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 W ...