题意:
一道有意思的构造题
有一个数组,将每一个区间的gcd放入一个集合里,给出集合,试还原原序列
大意:
1.原序列中的数字应该都是来自于这个集合的。
2.对于每一个区间来说,gcd不大于它们的最小值。
那么求出总体的gcd,并将每一个元素都除以这个gcd,如果现在序列中出现了1,就说明集合中的元素都能被一个属于该集合的元素整除,那么我们只要在每一个元素的前面插入一个公共gcd作为原序列就可以了。
如果操作后没有1,那就说明大家的公共gcd不在这个集合里,那这个集合就是无解的了。
code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=101000;
ll n;
ll mas[N];
vector<ll> q;
ll cnt=0;
ll sum=1;
ll gd=0;
void solve()
{
bool f=0;
for(int i=1;i<=n;++i)
{
mas[i]/=gd;
//cout<<mas[i]<<" ";
if(mas[i]==1) f=1;
}
if(!f)
{
cout<<-1;
return;
}
for(int i=1;i<=n;++i)
{
q.push_back(gd);
q.push_back(mas[i]*gd);
}
cout<<q.size()<<endl;
for(ll i:q) cout<<i<<" ";
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>mas[i];
gd=__gcd(gd,mas[i]);
}
solve();
return 0;
}