首页 > 其他分享 >P3226 [HNOI2012]集合选数(状压 DP)

P3226 [HNOI2012]集合选数(状压 DP)

时间:2022-11-12 09:44:06浏览次数:67  
标签:... int 选数 状压 HNOI2012 Maxn define

P3226 [HNOI2012]集合选数

要求选出集合 \(S\) 满足如果 \(x\) 选择了,\(2x\) 和 \(3x\) 都不能选择。

求 \(\{1,2,\dots,n\}\) 的符合要求的子集数量。

\(n\le 10^5\)。

发现对所有除去 \(2,3\) 因子后不同的数,他们之间没有关联,完全可以分开处理。

那么设除去 \(2,3\) 因子后剩下的数为 \(x\),则如果将所有数写成如下表格状,则我们的条件就转化为了选择矩阵的一个子集,使得相邻的数不能同时选择。

x  3x  9x  27x ...
2x 6x  12x ...
4x 12x 36x ...
8x 24x ...

发现一行的数的个数不会超过 \(\log_3 n\),大约为 \(12\),所以状压即可。

#define Maxn 100005
#define Maxlogn 25
#define Maxsta3 5005
#define mod 1000000001
int n,N,ans=1,All;
int dp[Maxlogn][Maxsta3],lim[Maxn],init[Maxn];
bool vis[Maxn];
inline int solve(int x)
{
	N=0; int ret=0;
	for(int tx2=x,tn=1;tx2<=n;tx2*=2,tn++,N++)
		for(int tx3=tx2,tm=1;tx3<=n;tx3*=3,tm++)
			vis[tx3]=true,lim[tn]=1<<tm;
	for(int s=0;s<lim[1];s++) dp[1][s]=init[s];
	for(int i=2;i<=N;i++) for(int s=0;s<lim[i];s++) if(init[s])
	{
		dp[i][s]=0;
		for(int t=0;t<lim[i-1];t++) if(!(s&t)) dp[i][s]=(dp[i][s]+dp[i-1][t])%mod;
	}
	for(int s=0;s<lim[N];s++) if(init[s]) ret=(ret+dp[N][s])%mod;
	return ret;
}
int main()
{
	n=rd(),All=5000;
	for(int i=0;i<=All;i++) init[i]=((i<<1)&i)?0:1;
	for(int i=1;i<=n;i++) if(!vis[i]) ans=1ll*ans*solve(i)%mod;
	printf("%d\n",ans);
	return 0;
}

标签:...,int,选数,状压,HNOI2012,Maxn,define
From: https://www.cnblogs.com/EricQian/p/16882727.html

相关文章

  • 2022CCPC威海 D. Sternhalma(记忆化搜索/状压)
    题意大概是给定一个19个格子的六边形棋盘,每个位置有一个分数,每次操作可以拿走一个棋子(不得分)或者将当前棋子跳过相邻的一个棋子(得分为跳过的棋子所在位置的分数)且将跳过的......
  • P8773 [蓝桥杯 2022 省 A] 选数异或
    题面给定一个长度为\(n\)的数列\(A_{1},A_{2},\cdots,A_{n}\)和一个非负整数\(x\),给定\(m\)次查询,每次询问能否从某个区间\([l,r]\)中选择两个数使得他......
  • CF1463F Max Correct Set(取小样法+状压 DP)
    CF1463FMaxCorrectSet要求选出集合\(U=\{1,2,3,\dots,n\}\)的一个子集\(S\),满足:如果\(a\inS\)并且\(b\inS\),那么\(|a-b|\not={x}\)并且\(|a-b|\not=......
  • CF1342F Make It Ascending(状压+求过程->求结果)
    CF1342FMakeItAscending给予一个包含\(n\)个元素的数组\(a\),你可以进行以下操作:选择两个不同的元素\(a_i,a_j\)(\(1\lei,j\len\),\(i\nej\))将\(a_j\)的......
  • 【CF1292F】Nora's Toy Boxes(状压DP)
    考虑将点分为$A,B$两类。其中$[x\inA]\iff\exists_{y\neqx},y|x$。那么我们删去的点只可能在$B$类中,且当前$x\inB$可删当且仅当存在$y\inB,z\inA$使得$z|x......
  • 【XSY3896】相似(dp套dp,状压)
    题面相似题解可以发现,\(S\)和\(T\)相似,等价于它们的最长公共子序列长度至少为\(n-k\)。首先考虑如何求出两个字符串的\(\text{LCS}\)(最长公共子序列)。考虑dp:......
  • 【XSY3513】Multiple of Nine(状压DP)
    题意:转化后变为:给一张\(n\)个点的图,你需要给每个点染上\([1,k]\)中的某个颜色,图上有\(m\)条边,每条边\((u,v)\)有两种边权\(w_1\)(当\(u,v\)颜色相同时)和\(w_2\)......
  • 【XSY3270】Domino Colorings(轮廓线dp,状压)
    若已经知道了每个格子的颜色,我们可以用轮廓线DP(类似插头DP)判断棋盘是否能被多米诺骨牌填满,设\(dp[S]\)表示是否存在某种填法使得轮廓线每个位置是否被填的状态为\(S\)......
  • 【XSY2444】【BZOJ4042】【CERC2014】【luogu4757】Parades(树形dp+状压dp)
    题面Description从前有个A国,它有\(n\)个城市和\(n-1\)条道路。每条路连接两个城市。城市之间两两可达。每个城市与不超过10条道路相连。现在给出\(m\)条路径,要求从这些......
  • 洛谷P3225 [HNOI2012]矿场搭建
    SLOJH7136.「HNOI2012」矿场搭建题目描述煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援......