zoukankan      html  css  js  c++  java
  • 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
    ") ; return 0 ;
            }
        }
        printf("%d
    " , m*2) ;
        rep(i,1,m) {
            printf("%d %d" , a[i] , a[1]) ;
            if(i==m) printf("
    ") ; else printf(" ") ;
        }
    }
    
  • 相关阅读:
    ajax的一些知识
    前端性能优化汇总
    jquery实现一些小动画二
    python简单日志处理
    逆波兰式---C实现
    java常见异常
    Hive与HBase集成及常见问题解决
    SQL for HBase
    Demystifying the Skip Scan in Phoenix
    Difference between DDL, DML and DCL commands
  • 原文地址:https://www.cnblogs.com/rayrayrainrain/p/7875561.html
Copyright © 2011-2022 走看看