码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-11-22 00:02:18      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:for   csharp   printf   [1]   数字   code   gcd   highlight   class   

现在有一个长度为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 构造

标签:for   csharp   printf   [1]   数字   code   gcd   highlight   class   

原文地址:http://www.cnblogs.com/rayrayrainrain/p/7875561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!