-
C - Marco and GCD Sequence
- CodeForces - 894C
- 题意:有一个数组a[1~n],对他们所有的1<=i<=j<=n求 gcd( a[i] ~ a[j] ),得到集合S;
- 该集合S满足:元素不重复、集合内元素满足严格单增;
- 现在给你一个S,让你求出a;
- 思路:又得保证构造出s集合又得不能多出新的元素,所以先考虑一下不合法状态,如果集合S中所有元素的gcd,
- 不是最小的那个数,则不合法,因为 集合中一定有 (a[1]-----a[n])所有元素的gcd,这一定是最小的那个,并且这个
- 最小的一定是的其他所有任意两个或多个gcd的gcd,接下来说合法的,为了让S完整,我们只需要把S复制一遍即可
- 但是这样有可能会多出一些元素来,所以巧妙地把S集合中最小的那个插在任意两个相邻的中间就导致他们的gcd最终不是
- 他本身就是最小的元素,这样就可以构造出合法序列了。
-
#include<bits/stdc++.h> using namespace std; #define maxn 5555 int n,m,a[maxn],temp,mi; int main() { cin>>m; for(int i=1; i<=m; i++) { cin>>a[i]; if(i==1)temp=a[i]; else temp=__gcd(temp,a[i]); } mi=a[1]; if(temp!=mi)cout<<-1<<endl; else { cout<<2*m-1<<endl; for(int i=1; i<=m; i++) { if(i==m)cout<<a[i]<<endl; else cout<<a[i]<<" "<<mi<<" "; } } }
C - Marco and GCD Sequence CodeForces - 894C -思维
最新推荐文章于 2019-09-07 20:11:24 发布