zoukankan      html  css  js  c++  java
  • hdu5334(2015多校4)--Virtual Participation(构造)

    题目链接:点击打开链接

    题目大意:给出一个数字k,要求做出一个长度小于等于10^5的序列。该序列中不同样的连续子序列有k个。

    构造啊,。,,,,一点辙都没有

    使用连续的数字做成序列,能够省事的计算出不同样的子序列有多少个。

    使用n个1,那么不同样子序列有n种。

    使用n个1和m个2,那么不同样的子序列有n+m+n*m种。

    使用n个1,m个2和l个3,那么不同样的子序列有n+m+l+n*m+n*l+m*l种。

    当k小于等于10^5时。直接输出k个1。

    当k大于10^5时。对于使用1,2,3的情况能够做出满足各种k的子序列。

    那么我们要求的就是求出n。m。l的值,

    令a = n+l+1 , b = m+l+1 , c = l ; 得到a,b是为了凑出n+m+l+n*m+n*l+m*l,终于a*b = k + c*c + c + 1

    枚举c。求k+c*c+c+1的全部约数。看是否有a和b满足a = n+l+1 , b = m+l+1 , c = l 而且n+m+l <= 10^5

    假设存在了就输出连续的n个1,m个2,l个3.

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std ;
    #define LL __int64
    int main() {
        LL k , a , b , c ;
        LL i , j , l , flag ;
        while( scanf("%I64d", &k) != EOF ) {
            if( k <= 100000 ) {
                printf("%I64d
    ", k) ;
                for(i = 1 ; i < k ; i++)
                    printf("1 ") ;
                printf("1
    ") ;
                continue ;
            }
            l = flag = 0 ;
            while( 1 ) {
                c = k+l*l+l+1 ;
                for(j = l+1 ; j*j <= c ; j++) {
                    a = j ;
                    if( c%a ) continue ;
                    b = c/a ;
                    if( b < l+1 ) continue ;
                    if( a-l-1+b-l-1+l <= 100000 ) {
                        flag = 1 ;
                        break ;
                    }
                }
                if( flag ) break ;
                l++ ;
            }
            printf("%I64d
    ", a+b-l-2) ;
            for(i = 0 ; i < a+b-l-2 ; i++) {
                if( i < a-l-1 )
                    printf("1") ;
                else if( i < a+b-2*l-2 )
                    printf("2") ;
                else
                    printf("3") ;
                if( i == a+b-l-3 ) printf("
    ") ;
                else printf(" ") ;
            }
        }
        return  0 ;
    }
    


  • 相关阅读:
    MyBatis学习笔记
    通过Executor来启动线程比用Thread的start()更好
    步骤2:JMeter 分布式测试(性能测试大并发、远程启动解决方案)
    步骤1:JMeter 录制脚本接口测试
    adb常用命令(手机测试)
    电商购物核心功能测试点
    APP测试基本流程以及APP测试要点
    Jmeter-jtl性能测试报告转换-2种导出方法
    Linux之find查找命令
    linux之top命令详解
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6800877.html
Copyright © 2011-2022 走看看