题解 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;
}
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/solution-cf1737f.html