luogu P3226 [HNOI2012]集合选数
因为限制关系只和2和3有关,如果把数中2的因子和3的因子都除掉,那剩下的数不同的数是不会相互影响,所以每次考虑剩下的数一样的一类数,答案为每类数答案的乘积
如果选了一个数,那么2的因子多1的和3的因子多1的数都不能选.假设这个数为\(2^a3^bc\),那就把这个数放在\(i\)行\(j\)列上,现在问题变成这一堆数有多少子集满足没有两个上下或左右相邻元素,那么状压一行的放数状态,一行一行扫过去dp即可
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double
using namespace std;
const int N=1e5+10,M=(1<<16)+10,mod=1e9+1;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
void ad(int &x,int y){x+=y,x-=x>=mod?mod:0;}
int n,f[2][M],nm[20],t,ans=1,s[M],ts;
vector<int> sq[N];
int main()
{
n=rd();
for(int i=1;i<=n;++i)
{
int x=i;
while(x%2==0) x/=2;
while(x%3==0) x/=3;
sq[x].push_back(i/x);
}
for(int i=0;i<1<<16;++i)
{
bool ok=1;
for(int j=0;ok&&j<15;++j) ok=!(i>>j&1)||!(i>>(j+1)&1);
if(ok) s[++ts]=i;
}
for(int i=1;i<=n;++i)
{
if(sq[i].empty()) continue;
vector<int>::iterator it;
memset(nm,0,sizeof(nm));
for(it=sq[i].begin();it!=sq[i].end();++it)
{
int x=*it,c2=1;
while(x%2==0) ++c2,x/=2;
++nm[c2];
}
t=0;
while(nm[t+1]) ++t;
int nw=1,la=0;
f[la][0]=1;
for(int j=1;j<=t;++j)
{
for(int k=1;s[k]<1<<nm[j-1];++k)
{
if(!f[la][s[k]]) continue;
for(int l=1;s[l]<1<<nm[j];++l)
if(!(s[k]&s[l])) ad(f[nw][s[l]],f[la][s[k]]);
f[la][s[k]]=0;
}
nw^=1,la^=1;
}
int sm=0;
for(int k=1;s[k]<1<<nm[t];++k)
ad(sm,f[la][s[k]]),f[la][s[k]]=0;
ans=1ll*ans*sm%mod;
}
printf("%d\n",ans);
return 0;
}
luogu P3226 [HNOI2012]集合选数的更多相关文章
- P3226 [HNOI2012]集合选数
考虑构造矩阵 1 3 9 27...... 2 6 18 54...... 4 12 36 108...... ...... 发现在这个矩阵上一个合法的集合是一个满足选择的数字不相邻的集合,由于行数列 ...
- 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
- 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 ...
- 2734: [HNOI2012]集合选数 - BZOJ
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...
- bzoj 2734: [HNOI2012]集合选数
题目描述 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中. 同学们不喜 ...
- 【刷题】BZOJ 2734 [HNOI2012]集合选数
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...
随机推荐
- rtmp 协议详解
1. handshake 1.1 概述 rtmp 连接从握手开始.它包含三个固定大小的块.客户端发送的三个块命名为 C0,C1,C2:服务端发送的三个块命名为 S0,S1,S2. 握手序列: 客户端通 ...
- tp5中很牛皮的一句sql语句,三个条件(两个不确定条件,一个硬性条件)
$result = Db::table('xxxxxx') // 表名 ->alias('g') ->join('xxxxx_2 u','g.user_id = u.id') -> ...
- 一、基础篇--1.1Java基础-Java运算符优先级
在一个表达式中可能包含多个有不同运算符连接起来的.具有不同数据类型的数据对象:由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结 ...
- oc 计算 带括号 式子
下面代码实现可以计算 类似以下的字符窜. @"(1+2*(3+4)+3)/2" 自写一个简单 stack .不知道 OC为什么不提供Stack类. #import <Foun ...
- 如何查看MySQL connection id连接id
每个MySQL连接,都有一个连接ID,可以通过 connection_id()查看. 连接id也可以通过以下方式查看: show processlist中id列 information_schema. ...
- 动态初始化swiper时,轮播图划不动得各种bug解决方法
var mybanner = new Swiper('.i-gd-banner', { speed: 500, loop: true, observer:true,//修改swiper自己或子元素时, ...
- JS原生上传大文件显示进度条-php上传文件
JS原生上传大文件显示进度条-php上传文件 在php.ini修改需要的大小: upload_max_filesize = 8M post_max_size = 10M memory_li ...
- Hibernate对象的状态分类
对象的状态: 临时状态Transient: 与数据库没有对应,跟Session没有关联 一般是新new出的对象 持久化状态Persistent: 对象在Session的管理之中,最终会有对应的数据库记 ...
- 【AMAD】schema -- 使用pythonic的方式进行schema验证
动机 简介 用法 个人评分 动机 验证数据是否符合规范是很有用的,比如: 用于单元测试 用于验证用户提交的数据是否合法 简介 schema1是一个用来验证python数据结构的库. 可以用来验证诸如: ...
- staticmethod自己定制
class StaticMethod: def __init__(self,func): self.func=func def __get__(self, instance, owner): #类来调 ...