【题解】

  思维题,看了别人的博客才会写。

  写出这样的矩阵:

  1,3,9,...

  2,6,18,...

  4,12.36,...

  8,24,72,...

  我们要做的就是从矩阵中选出一些数字,但是不能选相邻的。

  我们可以发现,在100000的范围内,这个矩阵最多只有18行,11列。

  那么这个矩阵的取数字的方案数直接状压DP即可。f[i][j]表示第i行,状态为j的方案数,转移就是f[i][j]=sigma(f[i-1][k]) ,条件是(j&k==0且k&(k>>1)==0)

  但是这个矩阵不能覆盖值域之内的所有数字,怎么办呢?我们可以找到最小的没有被覆盖的数,用它放在(1,1)的位置构造一个类似的矩阵。

  可以证明每个数字恰好在矩阵中出现一次。所以最终答案就是各个矩阵的答案相乘。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define rg register
#define N 50
#define MOD(x) ((x)>=mod?(x)-mod:(x))
using namespace std;
const int mod=;
int n,ans=,a[N][N],mx[N],f[N][],exp[N];
bool vis[];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
} inline int calc(int x){
memset(mx,,sizeof(mx)); memset(f,,sizeof(f));
a[][]=x;
for(rg int i=;i<=;i++)a[i][]=(a[i-][]*<=n)?a[i-][]<<:n+;
for(rg int i=;i<=;i++)
for(rg int j=;j<=;j++) a[i][j]=(a[i][j-]*<=n)?a[i][j-]*:n+;
for(rg int i=;i<=;i++)
for(rg int j=;j<=;j++)if(a[i][j]<=n){
mx[i]+=exp[j-];
vis[a[i][j]]=;
}
f[][]=;
for(rg int i=;i<=;i++)
for(rg int j=;j<=mx[i];j++)if(!(j&(j>>)))
for(rg int k=;k<=mx[i-];k++)if(!(j&k)&&!(k&(k>>)))
f[i][j]=MOD(f[i][j]+f[i-][k]);
return f[][];
}
int main(){
exp[]=; for(rg int i=;i<;i++) exp[i]=exp[i-]<<;
n=read();
for(rg int i=;i<=n;i++)if(!vis[i]) ans=(1ll*ans*calc(i))%mod;
printf("%d",ans);
return ;
}

BZOJ 2734 洛谷 3226 [HNOI2012]集合选数【状压DP】【思维题】的更多相关文章

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

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

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

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

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

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

  4. BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)

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

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

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

  6. bzoj 2734 [HNOI2012]集合选数 状压DP+预处理

    这道题很神啊…… 神爆了…… 思路大家应该看别的博客已经知道了,但大部分用的插头DP.我加了预处理,没用插头DP,一行一行来,速度还挺快. #include <cstdio> #inclu ...

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

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

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

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

  9. UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)

    题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...

随机推荐

  1. Linux下自动还原MySQL数据库的Shell脚本

    创建shell脚本topjui_source.exp,内容如下: #!/usr/bin/expect spawn echo "###### running... ######" s ...

  2. SpringMVC + ajax

    1.ajax 返回汉字乱码 解决方法: http://blog.sina.com.cn/s/blog_5f39177b0101it7h.html //方案一 response.setCharacter ...

  3. HDU - 6063 RXD and math

    Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6063 打表发现规律是n^k #include <iostream> #inc ...

  4. LCA+树状数组 POJ 2763 Housewife Wind

    题目传送门 题意:两种操作,问u到v的距离,并且u走到了v:把第i条边距离改成w 分析:根据DFS访问顺序,将树处理成链状的,那么回边处理成负权值,那么LCA加上BIT能够知道u到v的距离,BIT存储 ...

  5. 二分搜索 Codeforces Round #299 (Div. 2) C. Tavas and Karafs

    题目传送门 /* 题意:给定一个数列,求最大的r使得[l,r]的数字能在t次全变为0,每一次可以在m的长度内减1 二分搜索:搜索r,求出sum <= t * m的最大的r 详细解释:http:/ ...

  6. ForeignKeyConstraint 外键约束的使用及作用的学习[转]

    原文链接 da.SelectCommand.CommandText="select au_id,au_fname,au_lname from authors"; da.Fill(d ...

  7. bootstrap div 固定

    div固定在顶部样式: .navbar-fixed-top div固定在底部样式 .navbar-fixed-bottom

  8. PHP多图片上传类推荐

    多文件上传是PHP中的一个基础应用,反正PHPer都会遇到的问题,现在就介绍一个功能完善.强大的多文件上传类给大家吧,能用上这个类的地方会很多. <?php class Upload{ var ...

  9. LN : leetcode 416 Partition Equal Subset Sum

    lc 416 Partition Equal Subset Sum 416 Partition Equal Subset Sum Given a non-empty array containing ...

  10. 洛谷P3254 圆桌问题(最大流)

    题意 $m$个不同单位代表参加会议,第$i$个单位有$r_i$个人 $n$张餐桌,第$i$张可容纳$c_i$个代表就餐 同一个单位的代表需要在不同的餐桌就餐 问是否可行,要求输出方案 Sol 比较zz ...