这道题很神啊……

神爆了……

思路大家应该看别的博客已经知道了,但大部分用的插头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+预处理的更多相关文章

  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、时间复杂度分析)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...

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

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

  4. 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...

  5. $HNOI2012\ $ 集合选数 状压$dp$

    \(Des\) 求对于正整数\(n\leq 1e5\),{\(1,2,3,...,n\)}的满足约束条件:"若\(x\)在该子集中,则\(2x\)和\(3x\)不在该子集中."的子 ...

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

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

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

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

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

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

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

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

随机推荐

  1. ECSHOP在线手册布局参考图--积分商城 exchange_list.dwt

        A.购物车 1,设置方法 程序自动读取购物车的商品数量 2,代码相关 cart.lbi 中 {insert_scripts files='transport.js'} <div clas ...

  2. Swift基本语法以及与OC的比较

    一.注释: 1.单行注释和OC一致. 2.块注释中有与OC不同点:可以嵌套注释 二.常量和变量: 1.常量:初始化后可读不可写 let 2.变量:初始化后可读可写 var //不需要指定类型,系统会自 ...

  3. mysql数据库全局只读和会话只读问题解析

    对于系统的发布是经常有的事情,有些时候需要隔绝外界对数据库的更改但是还要求可以读取数据,对于mss sql 这个就是很简单,直接属性—>选项—>只读 ,但是对于mysql这是不同的,今天仔 ...

  4. 安卓开发21:深入理解Handler

    Handler相关说明: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释:安卓的UI线程(即OnCreate函数创建的线程)是线程非安全的.也就是说,在UI线程中,使用sleep这样 ...

  5. 【转】使用junit进行单元测试(中级篇)

    转自:http://blog.csdn.net/andycpp/article/details/1327346 我们继续对初级篇中的例子进行分析.初级篇中我们使用Eclipse自动生成了一个测试框架, ...

  6. 什么是IDOC,以及IDOC的步骤

    创建IDOC:   第一步:WE31 创建IDOC所包含的字段.   第二步:WE30 创建IDOC 把Segment分配给IDOC   第三步:WE81  创建信息类型   第四步:WE82   把 ...

  7. json处理复杂对象jsonConfig

     我们通常的Json字符串和java当对象互转.经常有选择性地过滤掉一些属性值,和json-lib包JsonConfig为我们提供了这样一个 特征,有几种方法实施细则. (1)建立JsonConf ...

  8. iOS三种定时器的用法NSTimer、CADisplayLink、GCD

    一,NSTimer //创建方式1 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector: ...

  9. iOS开发——新特性OC篇&Objective新特性

    Objective新特性 Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时, ...

  10. sql server char nchar nvarchar varchar之間的區別

    char存储固定长度的字符串,最大长度为8000个字节. varchar存储可变长度的字符串.最大长度为8000个字节. nchar存储固定长度的Unicode字符串,最大长度为4000个字符. nv ...