Codeforces Round #447 (Div. 2) C 构造

Posted 天翎月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #447 (Div. 2) C 构造相关的知识,希望对你有一定的参考价值。

现在有一个长度为n的数列 n不超过4000 求出它的gcd生成set 生成方式是对<i,j> insert进去(a[i] ^ a[i+1] ... ^a[j]) i<=j

然而现在给你了set 规模m<=1000 求原数列或check不可行

可以想到set中的max数字一定是原数列中的max , min数字一定是所有数字的因子 然而这样就走不下去了,没法通过枚举n或者什么来确定是否存在

一通乱想之后想出来了奇妙的解法。。

解:最小的数字为x 那么原数列中所有的数字都是x的倍数 它们一旦和x进行了gcd的操作,就一定会变成x。。

所以。。若给出的set为 a[1] a[2] a[3] a[4]

只需要输出 a[1] x a[2] x a[3] x a[4] x .. 这样对于所有的1区间异或 要么是区间长度为1 gcd是本身 要么是区间中包含x,那么gcd直接下降到x。

int a[1050] ;

int main () {
    int m = read() ;
    rep(i,1,m) a[i] = read() ;
    rep(i,2,m) {
        if(a[i]%a[1]!=0) {
            printf("-1\n") ; return 0 ;
        }
    }
    printf("%d\n" , m*2) ;
    rep(i,1,m) {
        printf("%d %d" , a[i] , a[1]) ;
        if(i==m) printf("\n") ; else printf(" ") ;
    }
}

 

以上是关于Codeforces Round #447 (Div. 2) C 构造的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #447 (Div. 2)

Codeforces Round #447 (Div. 2) A

Codeforces Round #447 (Div. 2) 题解 ABCDE

Codeforces Round #447 (Div. 2)

Codeforces Round #447 (Div. 2) AQAQ

Codeforces Round #447 Div. 2