C - Marco and GCD Sequence CodeForces - 894C -思维

本文解析了CodeForces-894C题目,探讨了如何根据给定的GCD集合S构造原数组a[1~n]的方法。首先判断集合S的合法性,然后通过巧妙插入最小GCD值确保序列的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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<<" ";
            }
        }
    }

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值