题解 CF1737F【Ela and Prime GCD】

看了题解,和我假做法完全不同。

这是能想出来的吗???

Problem

给定 \(c\) 的质因数分解:\(c=p_1^{b_1}p_2^{b_2}\cdots p_m^{b_m}\)。它的因数个数明显为 \(n=(b_1+1)(b_2+1)\cdots(b_m+1)\)。构造长为 \(n-1\) 的整数数列 \(a\),使得:

  • 它的 \(n-1\) 个数两两不同,都不为 \(1\),都是 \(c\) 的因数。
  • \(\gcd(a_i,a_{i+1})\) 为质数。\(1\) 不是质数。

构造一个,或者无解。\(m\leq 16\)\(nm\leq 2^{20}\)

Solution

我们在方案最前面加一个 \(1\)\(x,y,z\) 都指的是 \(p_i\),明显 \(p_i\) 是什么不重要。

  • 如果 \(b_i\geq 4\) 立马无解,这是因为考虑到:\(x,x^2,x^3,x^4\) 怎么调换顺序都无解。
  • 如果 \(b_i=3\) 还能有解:\(1,x^2,x,x^3\)
  • 但是 \(b_i=3,b_j\geq 2\) 无解。首先全部项都可以和 \(1,x,y\) 相邻;你发现 \(x^3y^2\)\(x^2y^2\) 没有选择了,现在 \(1,x,y\) 只能留一个 \(x\)\(y\)。然后 \(x^3y\) 还能和 \(y^2\) 相邻,\(x^2y\) 还能和 \(y^2\) 相邻,寄了。
  • 还有三个 \(b_i=2\) 无解。因为你发现 \(xyz\) 的倍数有八个,它们必须和 \(1,x,y,z,x^2,y^2,z^2\) 其中一个相邻,好了这些里面只能留一个。$$ ,瞬间矛盾。
  • 那还有别的矛盾吗?这相当于在问 \(2^p3^q\leq p+q+1\) 的有解情况。已经得到 \(p=1\Rightarrow q=0\)\(p>1\) 无解;\(p=0\)\(q>3\)。我们讨论完了所有情况。 以上错的

考虑增量构造,因为假设没有 \(b_i=1\) 那么情况有限可以枚举:

  • 单个 \(b_i=3\) 的解 \(1,x^2,x,x^3\)
  • 一个 \(b_i=2\) 的解 \(1,x^2,x\) 或者 \(1,x,x^2\)
  • 两个 \(b_i=2\) 的解有很多,这里选一个末尾为质数的等会要用:\(1,x^2y^2,x,x^2y,y^2,xy,x^2,xy^2,y\) 这里的关键是:\(x^2y^2\) 两边是 \(1,x,y\)\(xy\) 两边是 \(x,y,x^2,y^2\)

从这些基本情况出发可以增量构造了。就是说已经知道 \(c\) 的答案,要求 \(c\times p\) 的答案其中 \(p\) 是不在 \(c\) 中的质数。

如果现在 \(c\) 的末尾是质数我们有构造:将 \(c\) 翻转复制接在后面,然后所有奇数位(第一位除外)乘上 \(p\)。最后的 \(1\) 改成 \(p\)

\([1,x^2y^2,x,x^2y,y^2,xy,x^2,xy^2,y]\)
\(\to[1,x^2y^2,x,x^2y,y^2,xy,x^2,xy^2,y,y,xy^2,x^2,xy,y^2,x^2y,x,x^2y^2,1]\)
\(\to[1,x^2y^2,xp,x^2y,y^2p,xy,x^2p,xy^2,yp,y,xy^2p,x^2,xyp,y^2,x^2yp,x,x^2y^2p,p]\)

剩下 \(c\) 末尾不为质数的 \([1,x^2,x,x^3]\),如果倒着就寄了,我们可以顺着复制接在后面,注意我们要保证数组中元素两两不同。所以前半部分偶数位(当然没有第一位)乘上 \(p\),后半部分奇数位乘上 \(p\),就是 \([1,x^2p,x,x^3p,p,x^2,xp,x^3]\) 寄了,因为 \(1,x^2\) 本来没有 \(\gcd\),我们微调。结果是 \(swap(c_{n/2+1},c_{n+1})\) 不知道怎么想的。可能是从想着把 \(1,x^2\) 换成 \(x,x^2\),然后将 \(x\) 调过来而想出来的。

想一下 \([1,x,x^2]\) 到底有没有前途,我们像上面那样做,\([p,x,x^2p,1,xp,x^2]\to[1,p,x^2p,x,xp,x^2]\),评价是也行但是烦。

Code

点击查看代码

下标从零开始

// LUOGU_RID: 116473202

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr,##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
typedef long long LL;
int m;
int mian(){
	vector<int> b(m);
	for(int&x:b) scanf("%d",&x);
	vector<int> buc[4];
	for(int i=0;i<m;i++){
		if(b[i]>=4) return puts("-1"),0;
		else buc[b[i]].push_back(i);
	}
	if(
		buc[2].size()>=3
		||(buc[3].size()==1&&buc[2].size()>0)
		||buc[3].size()>=2
	) return puts("-1"),0;
	vector<vector<int>> ans;
	if(buc[3].size()){
		int x=buc[3][0];
		vector<int> tmp(m);
		tmp[x]=0,ans.push_back(tmp);
		tmp[x]=2,ans.push_back(tmp);
		tmp[x]=1,ans.push_back(tmp);
		tmp[x]=3,ans.push_back(tmp);
		for(int y:buc[1]){
			int n=ans.size();
			for(int i=0;i<n;i++) ans.push_back(ans[i]);
			for(int i=1;i<n;i+=2) ans[i][y]=1;
			for(int i=0;i<n;i+=2) ans[i+n][y]=1;
			ans[0][y]=0;
			swap(ans[n/2],ans[n]);
		}
	}else{
		vector<int> tmp(m);
		if(buc[2].size()==2){
			int x=buc[2][0],y=buc[2][1];
			//1,x^2y^2,x,x^2y,y^2,xy,x^2,xy^2,y
			tmp[x]=0,tmp[y]=0,ans.push_back(tmp);
			tmp[x]=2,tmp[y]=2,ans.push_back(tmp);
			tmp[x]=1,tmp[y]=0,ans.push_back(tmp);
			tmp[x]=2,tmp[y]=1,ans.push_back(tmp);
			tmp[x]=0,tmp[y]=2,ans.push_back(tmp);
			tmp[x]=1,tmp[y]=1,ans.push_back(tmp);
			tmp[x]=2,tmp[y]=0,ans.push_back(tmp);
			tmp[x]=1,tmp[y]=2,ans.push_back(tmp);
			tmp[x]=0,tmp[y]=1,ans.push_back(tmp);
		}else if(buc[2].size()==1){
			int x=buc[2][0];
			tmp[x]=0,ans.push_back(tmp);
			tmp[x]=2,ans.push_back(tmp);
			tmp[x]=1,ans.push_back(tmp);
		}else{
			int x=buc[1].back(); buc[1].erase(prev(buc[1].end()));
			tmp[x]=0,ans.push_back(tmp);
			tmp[x]=1,ans.push_back(tmp);
		}
		for(int y:buc[1]){
			int n=ans.size();
			for(int i=n-1;i>=0;i--) ans.push_back(ans[i]);
			for(int i=0;i<n<<1;i+=2) ans[i][y]=1;
			ans[0][y]=0,ans.back()[y]=1;
		}
	}
	ans.erase(ans.begin());
	for(auto&&elem:ans){
		for(int x:elem) printf("%d ",x);
		puts("");
	}
	return 0;
}
int main(){
//	#ifdef LOCAL
//	 	freopen("input.in","r",stdin);
//	#endif
	for(scanf("%*d");~scanf("%d",&m);mian());
	return 0;
}
posted @ 2023-07-19 19:05  caijianhong  阅读(18)  评论(0编辑  收藏  举报