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(" ") ;
    }
}

 

posted @ 2017-11-21 21:52  天翎月  阅读(98)  评论(0编辑  收藏  举报