[HNOI 2012]集合选数
Description
对于任意一个正整数 \(n\) ,求出集合 \(\{1,2,\cdots,n\}\) 的满足约束条件“若 \(x\) 在该子集中,则 \(2x\) 和 \(3x\) 不能在该子集中”的子集的个数。
\(n\leq 100000\)
Solution
容易发现对于每一个与 \(2,3\) 互质的数 \(k\) ,我们构造一个 \(p\times q\) 的矩阵,该矩阵的第 \(i\) 行第 \(j\) 列表示数值 \(k\cdot 2^i3^j\) 。由于数值要 \(\leq n\) ,所以这个矩阵不是完整的。
显然对于这个矩阵,我选取的数不能相邻,由于 \(p,q\) 很小,可以用状压 \(DP\) 实现,来计算总方案数。
同样对于每个这样的 \(k\) 。可以随意组合所以将方案数乘起来就好了。
Code
//It is made by Awson on 2018.3.9
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int yzh = 1000000001, N = 200000;
void read(int &x) {
    char ch; bool flag = 0;
    for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());
    for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());
    x *= 1-2*flag;
}
void print(LL x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(LL x) {if (x < 0) putchar('-'); print(Abs(x)); }
int n, ans = 1, bin[20], f[20][N+5];
void work() {
    read(n); bin[0] = 1; for (int i = 1; i <= 19; i++) bin[i] = bin[i-1]<<1;
    for (int id = 1; id <= n; id++)
    if (id%2 && id%3) {
        int last = 0, now, tmp = id, k; f[0][0] = 1;
        for (k = 1; tmp <= n; k++) {
        for (now = 0; now <= 19; now++) if (tmp*bin[now] > n) break;
        for (int i = 0; i < bin[now]; i++)
            if ((i&(i>>1)) == 0) {
            f[k][i] = 0;
            for (int j = 0; j < bin[last]; j++)
                if ((i&j) == 0 && (j&(j>>1)) == 0)
                f[k][i] = (f[k][i]+f[k-1][j])%yzh;
            }
        last = now, tmp *= 3;
        }
        int t = 0;
        for (int i = 0; i < bin[last]; i++) if ((i&(i>>1)) == 0) t = (t+f[k-1][i])%yzh;
        ans = 1ll*ans*t%yzh;
    }
    writeln(ans);
}
int main() {
    work(); return 0;
}[HNOI 2012]集合选数的更多相关文章
- 【BZOJ-2732】集合选数     状压DP  (思路题)
		2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ... 
- bzoj 2734: [HNOI2012]集合选数 状压DP
		2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ... 
- 【BZOJ2734】【HNOI2012】集合选数(状态压缩,动态规划)
		[BZOJ2734][HNOI2012]集合选数(状态压缩,动态规划) 题面 Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所 ... 
- BZOJ_2734_[HNOI2012]集合选数_构造+状压DP
		BZOJ_2734_[HNOI2012]集合选数_构造+状压DP 题意:<集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x ... 
- 2734: [HNOI2012]集合选数
		2734: [HNOI2012]集合选数 链接 分析: 转化一下题意. 1 3 9 27... 2 6 18 54... 4 12 36 108... 8 24 72 216... ... 写成这样的 ... 
- [HNOI2012]集合选数 --- 状压DP
		[HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x ... 
- 【BZOJ-2734】集合选数     状压DP  (思路题)
		2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ... 
- bzoj2734【HNOI2012】集合选数
		2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 831 Solved: 487 [Submit][Stat ... 
- 状压DP之集合选数
		题目 [HNOI2012]集合选数 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不 ... 
随机推荐
- 『转载』从内存资源中加载C++程序集:CMemLoadDll
			MemLoadDll.h #if !defined(Q_OS_LINUX) #pragma once typedef BOOL (__stdcall *ProcDllMain)(HINSTANCE, ... 
- beta冲刺3-咸鱼
			一,昨天的问题: 页面整理还没做 我的社团这边的后台数据库未完成,前端代码修改未完成. 二,今天已完成 页面整理基本完成,把登陆独立出来了,然后基本处理掉了多余页面(反正也没几个--) 我的社团这边试 ... 
- bug终结者 团队作业第八周
			bug终结者 团队作业第八周 本次任务 素材提供及编辑:20162328 蔡文琛 博客修改完善:20162322 朱娅霖 "bug终结者" 宏伟蓝图 UML 手绘底稿 用例图 选项 ... 
- Hey,man,are you ok? -- 关于心跳、故障监测、lease机制
			电话之于短信.微信的一个很大的不同点在于,前者更加及时,有更快速直接的反馈:而后面两个虽然称之为instant message,但经常时发出去了就得等对方回复,等多久是不确定的.打电话能明确知道对方在 ... 
- Hazelcast分布式
			一般的应用正式环境中都不止一台服务器(也就是说是集群的),那么如果只是简单的将数据预加载到内存,那么就会有数据不同步的现象. (更新了其中一台JVM,另一台JVM并不会收到通知从而保持数据同步). 这 ... 
- emqtt 试用(二)验证 emq 和 mosquito 的共享订阅
			本地订阅(Local Subscription) 本地订阅(Local Subscription)只在本节点创建订阅与路由表,不会在集群节点间广播全局路由,非常适合物联网数据采集应用. 使用方式: 订 ... 
- 新概念英语(1-139)Is that you, John?
			Lesson 139 Is that you, John? 是你吗,约翰? Listen to the tape then answer this question. Which John Smith ... 
- Angular 学习笔记 ( 链接服务器 )
			ng 是做前端开发的, 所以通常我们会配上一个 API server. 本地调试时通常使用 proxy https://github.com/angular/angular-cli/blob/mast ... 
- [八省联考2018] 劈配 mentor
			Description 一年一度的综艺节目<中国新代码>又开始了.Zayid 从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. Input 轻车熟路的Zay ... 
- [52ABP实战课程系列]Docker&Ubuntu从入门到实战开课啦~
			任何的课程都逃不开理论的支持 久等了各位,在Asp.NET Core2.0 项目实战入门视频课程结束后,根据发起的投票信息.Docker 排在首位.按照结果,我们开始进行Docker视频课程的录制. ... 
