bzoj 2734 [HNOI2012]集合选数 状压DP+预处理
这道题很神啊……
神爆了……
思路大家应该看别的博客已经知道了,但大部分用的插头DP。我加了预处理,没用插头DP,一行一行来,速度还挺快。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 100100
#define M 50
#define yu 1000000001
#define inf 1<<29
using namespace std;
int n;
long long ans=;
long long f[][N/M]={};
int keneng[N/M],kenengnum;
int sushu[N],sushunum; void make_sushu(int limit) // 这里不是筛素数,而是把不是2,3的倍数的筛出来
{ // 如果筛素数,25不是素数,但是5的矩阵不能包含25
int i,j,k;
int vis[N]={};
sushunum=;
for (i=;i<=limit;i++)
if (i%!=&&i%!=)
sushu[++sushunum]=i;
} bool shifou(int now) // 预处理的判断,判断是否有两个1相连
{ // 即是否取连续的两个数
int i,j,k;
i=now&; now>>=;
while (now!=)
{
j=now&;
if (i==j&&i&&j)
return false;
i=j;
now>>=;
}
return true;
} void chuli(int limit) //预处理,把可以选的状态存起来,省时间
{
int i,j,k;
int maxn=;
kenengnum=;
for (i=;i<=limit;i++)
maxn*=;
for (i=;i<maxn;i++)
{
if (shifou(i))
{
keneng[kenengnum++]=i;
}
}
} int pd_long(int x) // 由于矩阵每一行长度不同,所以预处理某些不能用
{ // 这个判断每一行长度
int i=,zanshi=;
while (i<=x)
{
zanshi++;
i*=;
}
return zanshi;
} long long make_juzhen(int now)
{
int i,j,k,x=,y,z;
int limit,lnow,lnowbefore=inf;
limit=pd_long(n/now);
chuli(limit);
f[][]=;
for (i=;x*now<=n;i++,x*=)
{
memset(f[i%],,sizeof(f[i%]));
lnow=pd_long(n/now/x); // 当前行的长度
for (j=;j<kenengnum;j++)
{
if (keneng[j]>>lnow>) //如果有选超过当前行长度的,不选
{
f[i%][j]=;
continue;
}
for (k=;k<kenengnum;k++) // 和上一行比较,是否有相连的1选了
{
if (keneng[k]>>lnowbefore>) // 上一行状态不能超过上一行长度
continue;
if (keneng[j]&keneng[k])
continue;
f[i%][j]+=f[(i+)%][k];
f[i%][j]%=yu;
}
}
lnowbefore=lnow; // 上一行长度
}
return (f[(i+)%][]+f[(i+)%][])%yu; //最后一行一定只有一个,答案只有这两种情况加起来,最后一个选或不选
} int main()
{
int i,j,k,x,y,z;
cin>>n;
make_sushu(n);
for (i=;i<=sushunum;i++)
{
ans*=make_juzhen(sushu[i]);
ans%=yu;
}
cout<<ans<<endl;
}
bzoj 2734 [HNOI2012]集合选数 状压DP+预处理的更多相关文章
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
- [HNOI2012]集合选数 --- 状压DP
[HNOI2012]集合选数 题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出\({1,2,3,4,5}\)的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x ...
- 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...
- $HNOI2012\ $ 集合选数 状压$dp$
\(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...
- 【BZOJ-2732】集合选数 状压DP (思路题)
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ...
- 【BZOJ-2734】集合选数 状压DP (思路题)
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1070 Solved: 623[Submit][Statu ...
- BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]
传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...
- bzoj 2734: [HNOI2012]集合选数
题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中. 同学们不喜 ...
随机推荐
- 提高你的Java代码质量吧:少用静态导入
一.分析 从Java 5开始引入静态导入语法(import static),其目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序. 但是,滥用静态导入会使程序更难阅读,更难维护.静态导 ...
- CF 319B Psychos in a Line 【单调队列】
维护一个单调下降的队列. 对于每一个人,只需要找到在他前面且离他最近的可以杀掉他的人即可. #include <cstdio> #include <vector> #inclu ...
- Flex Metadata tags 元数据标签
1.[Alternative] [可替换] 标明此类可以被参数中的类替换,版本号说明发生替换的版本. [Alternative]和[Deprecated] 不同.如果是[不建议使用]的类,以后的版本可 ...
- 黑马程序猿_7K面试题之交通灯系统
交通灯信号模拟系统 一.概述 模拟实现十字路口的交通灯管理系统逻辑,详细需求例如以下:(需求直接来源于老师的文档) ① 异步随机生成依照各个路线行驶的车辆. 比如: 由南向而来去往北向的车辆 ...
- POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)
Drainage DitchesHal Burch Time Limit 1000 ms Memory Limit 65536 kb description Every time it rains o ...
- Mac Pro更换SSD后,在Win7下启用ACHI的方法AHCI
在Mac Pro下更换SSD后,如果安装Win7,要将SSD改为AHCI模式是非常麻烦的.本文介绍如何将Mac的Win7下的SSD改为AHCI方式驱动,及几种常见问题的处理. 一.当Lion与Win7 ...
- firefly 问题
1.G:\servers\Python27\Lib\mimetypes.py reload(sys) sys.setdefaultencoding('gb18030') 2.G:\servers\Py ...
- PAT 1012
1012. The Best Rank (25) To evaluate the performance of our first year CS majored students, we consi ...
- 在iOS上自动检测内存泄露
手机设备的内存是一个共享资源.应用程序可能会不当的耗尽内存.崩溃,或者遭遇大幅度的性能降低. Facebook iOS客户端有很多功能,并且它们共享同一块内存空间.如果任何特定的功能消耗过多的内存,就 ...
- Swift数据类型
1.Swift中常用数据类型:首字母大写 Int.Float.Double.Bool.Character.String Array.Dictionary.元组类型(Tuple).可选类型Optiona ...