已经八月份了药丸,开始肝作业并且准备高考啦!!

【题目大意】

《集合论与图论》这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中。现在求以下问题:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足上述约束条件的子集的个数(只需输出对 1,000,000,001 取模的结果)(包括空集)。

【思路】

对于n以内任意与6互质的整数x,我们列出一个矩阵:

x 3x 9x 27x ...

2x 6x 18x 54x ...

4x 12x 36x 108x ...

所以我们现在枚举与6互质的这个数x,然后进行状态压缩的转移。这个有点类似于先前的king。f[i][j]表示到第i行,且第i行状态为j的总可能性。不过它并不一定是矩形,每一行的列数可能不同,对于某行列数为j,我们只需枚举0..2^j-1的状态,并记录为before转移到下一行DP。

这里用了滚动数组,不过不要忘记每次新的滚动数组都要清空一下。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mod 1000000001
using namespace std;
typedef long long LL;
const int MAXN=;
int n;
int usable[<<MAXN],f[][<<MAXN];
bool mark[<<MAXN]; int Usable(int x)
{
if (x<<&x || x>>&x) return ;else return ;
} int dp(int now)
{
memset(f,,sizeof(f));
int cur=,before=-;//before指上一行有几个数
for (int i=;now*(<<i)<=n;i++)//枚举每一行的第一个数,求出总的行数
{
cur=-cur;
int tmp=now*(<<i),j;
for (j=;tmp<=n;j++,tmp*=);//求出每一行有几个数
for (int k=;k<(<<j);k++)//枚举当前行的状态
{
f[cur][k]=;//【不要忘记了初始化☆】
if (usable[k])
{
if (before==-) {f[cur][k]=;continue;}//如果是第一行,则将可行状态设为1
for (int p=;p<(<<before);p++)
if (usable[p])
if ((k&p)==) f[cur][k]=f[cur][k]+f[-cur][p],f[cur][k]%=mod;//这里不要忘记了也要mod
}
}
before=j;
}
int ans=;
for (int i=;i<(<<before);i++) ans+=f[cur][i],ans%=mod;
return (ans);
} void getusable()
{
memset(usable,,sizeof(usable));
for (int i=;i<(<<MAXN);i++)
if (Usable(i)) usable[i]=;
} void solve()
{
memset(mark,,sizeof(mark));
LL ans=;//为了防止乘法的时候溢出,可以先用longlong,再转换回int
for (int i=;i<=n;i++)
if ((i%)&&(i%)) ans=(ans*dp(i))%mod;
printf("%d\n",(int)ans);
} int main()
{
scanf("%d",&n);
getusable();
solve();
return ;
}

【状压DP】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. bzoj2734: [HNOI2012]集合选数

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

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

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

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

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

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

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

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

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

  8. 2734: [HNOI2012]集合选数

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

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

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

随机推荐

  1. 大聊Python----SocketServer

    什么是SocketServer? SocketServer的最主要的作用是实现并发处理,也就是可以多个用户同时上传和下载文件. socketserver模块简化了编写网络服务器的任务. sockets ...

  2. 我用.htaccess做了些什么?

    1.防图片盗链,减轻流量压力: 2.index.php 301转向到域名,有利于PR权重集中: 3.其它还不会,慢慢来…… 我是如何做的? <IfModule mod_rewrite.c> ...

  3. [Leetcode Week16]Range Sum Query - Mutable

    Range Sum Query - Mutable 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/range-sum-query-mutable/de ...

  4. C++之指针,引用与数组

    引用只是对象的另一个名字,通过在变量名前面添加"&”符号来定义,而指针保存的是另一个对象的地址,它们两都提供了间接访问所服务变量的途径. 但是它们的差别还是挺大的: 先从它们的值说起 ...

  5. Linux 入门记录:九、Linux 文件系统挂载管理

    一.挂载操作 磁盘或分区创建好文件系统后,需要挂载到一个目录才能够使用. Windows 或 Mac 系统会进行自动挂载,一旦创建好文件系统后会自动挂载到系统上,Windows 上称之为 C 盘.D ...

  6. google fcm 推送的流程

    总结:1.给一个人推,能成功,2.给多个人推,有两种,一种是给组推,一种是给主题推,之前用的是组推,但是不成功,这里换成主题推: <?phpnamespace App\Http\Controll ...

  7. CF1064 E - Dwarves, Hats and Extrasensory Abilities

    题意 交互题, 本来应该是在平面上进行的. 实际上换成一条直线就可以, 其实换成在平面上更复杂一些. Solution 假设\(l\)点是黑点, \(r\)处是白点, 那么就把下一个点的位置放置在\( ...

  8. hihocoder 1145 : 幻想乡的日常

    #1145 : 幻想乡的日常 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 幻想乡一共有n处居所,编号从1到n.这些居所被n-1条边连起来,形成了一个树形的结构. 每处 ...

  9. Django 如何实现文件下载

    1. 思路: 文件,让用户下载 - a标签+静态文件 - 设置响应头(django如何实现文件下载) 2. a标签实现 <a href="/static/xxx.xlsx"& ...

  10. C语言 ,两个字符串参数,判断是否包含另一个字符串,返回所在位置

    char * cyp(char *s1,char *s2) { char *p = NULL; char *q = NULL; char *q1 = NULL; while(*s1!='\0') { ...