首页 > 其他分享 >洛谷 P3226 [HNOI2012] 集合选数 做题记录

洛谷 P3226 [HNOI2012] 集合选数 做题记录

时间:2024-11-18 11:29:15浏览次数:1  
标签:vis 洛谷 HNOI2012 read 选数 矩阵 int mod define

我们先建一个矩阵:
\(\begin{bmatrix} 1 &2 & 4 & 8 & 16 & 32\\ 3 & 6 & 12 & 24 & 48 & 96\\ 9 & 18 & 36 & 72 & 144 & 288\\ 27 & 54 & 108 & 216 & 432 & 864 \end{bmatrix}\)
横排的每个数是左侧的两倍,竖排的每个数是上侧的三倍。
那么不能有 \(2\) 或 \(3\) 倍关系就是矩阵上选出不相邻的点(相邻在这里指四连通),用状压 dp 即可。
由于 \(n\le 10^5\),所以我们的矩阵不会太大。
对于每一个不在矩阵中的数开一个形如上方的矩阵,这样的数不会太多。

点击查看代码
#include<bits/stdc++.h>
#define int ll
#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define inn(i,n,a) For(i,1,n) a[i]=read();

#define ll long long
#define i128 __int128

using namespace std;
inline int read() {
	int xx= 0;int f= 1;
	char c = getchar();
	while(c<'0'||c>'9') { 
		if(c=='-') f= -1;
		c= getchar();
	}
	while(c>='0'&&c<='9') {
		xx= (xx<<1)+(xx<<3)+(c^48);
		c= getchar();
	}
	return xx*f;
}
#define maxn 100050
const int mod = 1e9+1;
int n,m;
bool vis[maxn];
int a[19][13];
int f[2][(1<<12)+514];
int siz[19],lim[19];
int use[(1<<18)];
void init(int x) {
	For(i,1,18) {
		if(i==1) a[i][1]=x;
		else a[i][1]=a[i-1][1]<<1;
		if(a[i][1]>n) break;
		m=i,siz[i]=1,vis[a[i][1]]=1;
		For(j,2,18) {
			a[i][j]=(a[i][j-1]<<1)+a[i][j-1];
			if(a[i][j]>n) break;
			siz[i]=j,vis[a[i][j]]=1;
		}
		lim[i]=(1<<siz[i])-1;
	}
}
int work() {
	i128 res=0;
	For(i,0,lim[1]) f[1][i]=use[i];
	For(i,2,m) For(j,0,lim[i]) {
		if(!use[j]) continue;
		f[i&1][j]=0;
		For(k,0,lim[i-1]) {
			if(use[k]&&!(k&j)) 
				f[i&1][j]+=f[(i-1)&1][k];
		}
		if(f[i&1][j]>mod) f[i&1][j]%=mod;
	}
	For(i,0,lim[m]) {
		res+=f[m&1][i];
	}
	return res%mod;
}
void works() {
	in1(n);
	int ans=1;
	For(i,1,n) if(!vis[i]) {
		init(i);
		ans=ans*work()%mod;
	}
	cout<<ans<<'\n';
	For(i,1,n) vis[i]=0;
}
signed main() {
	For(i,0,(1<<12)-1) use[i]=(i&(i<<1))?0:1;
	works();
}

标签:vis,洛谷,HNOI2012,read,选数,矩阵,int,mod,define
From: https://www.cnblogs.com/CodingGoat/p/18552240

相关文章

  • 洛谷题单指南-二叉堆与树状数组-P3368 【模板】树状数组 2
    原题链接:https://www.luogu.com.cn/problem/P3368题意解读:树状数组应用-区间修改,单点求值解题思路:设原数组为s[N],其差分数组为a[N]操作一:区间修改要对s[x]~s[y]每个数增加k,相当于对a[x]加k,对a[y+1]减k,O(n)的操作变成了O(1)的操作,利用树状数组tr[N]的add(x,k),add(y+......
  • 洛谷题单指南-二叉堆与树状数组-P3374 【模板】树状数组 1
    原题链接:https://www.luogu.com.cn/problem/P3374题意解读:树状数组模版:单点修改,区间求值。解题思路:树状数组-BinaryIndexTree可以动态维护一组数,可以O(logn)的修改一个数,也可以O(logn)的计算一段区间的和。思考一下朴素做法:如何修改一个数,计算区间和?如果是常规数组,修改操作......
  • 洛谷P1607
    [NOIP2009普及组]多项式输出-洛谷 [NOIP2009普及组]多项式输出题目描述一元n次多项式可用如下的表达式表示:f(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots+a_1x+a_0,a_n\ne0其中,a_ix^i称为i次项,a_i称为i 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定......
  • CSP/信奥赛C++语法基础刷题训练(11):洛谷P5743:猴子吃桃
    CSP/信奥赛C++语法基础刷题训练(11):洛谷P5743:猴子吃桃题目描述一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第n......
  • CSP/信奥赛C++语法基础刷题训练(12):洛谷P1047:[NOIP2005 普及组] 校门外的树
    CSP/信奥赛C++语法基础刷题训练(12):洛谷P1047:[NOIP2005普及组]校门外的树题目描述某校大门外长度为lll的马路上有一排树,每两棵相邻的树之间的间隔都是......
  • 达梦数据库DM管理工具如何浏览数据,用条件筛选数据
    前言大家好,我是小徐啊。达梦数据库是我们一款常用的国产数据库,我之前一直在使用它。用起来和mysql和postgresql比起来,还是差不多的。而且它自带了数据库连接工具DM管理工具,使我们很方便的连接它。今天,小徐就来介绍下如何用DM管理工具浏览数据,并且用条件去筛选数据。手把手教学。......
  • 洛谷 P6874 [COCI2013-2014#6] KOCKICE
    动笔算算样例可得一个性质,只要确定中间位置的数是多少,其他位置就可以直接求出。如果我们暴枚中间的数,必然超时。于是我们需要用二分。如果中间位置上的数是答案,那么无论什么数,操作次数一定多于他。所以我们只要判断关系就能判断往哪边找。代码:#include<bits/stdc++.h>using......
  • CSP/信奥赛C++语法基础刷题训练(9):洛谷P1035:[NOIP2002 普及组] 级数求和
    CSP/信奥赛C++语法基础刷题训练(9):洛谷P1035:[NOIP2002普及组]级数求和题目描述已知:Sn=1......
  • CSP/信奥赛C++语法基础刷题训练(10):洛谷P1307:[NOIP2011 普及组] 数字反转
    CSP/信奥赛C++语法基础刷题训练(10):洛谷P1307:[NOIP2011普及组]数字反转题目描述给定一个整数NNN,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,......
  • 洛谷 P2890 [USACO07OPEN] Cheapest Palindrome G 做题记录
    我不会区间dp。设\(f_{i,j}\)表示使得区间\([i,j]\)为回文串的最小操作代价,\(cost_{i,j}\)表示字母\(i\)删除/添加的耗费,那么显而易见的,我们有:\(f_{i,j}\to\min(f_{i,j-1}+\min(cost_{s_j,0},cost_{s_j,1}),f_{i+1,j}+\min(cost_{s_i,0},cost_{s_i,1}))\)。当\(s_i......