zoukankan      html  css  js  c++  java
  • Finite Encyclopedia of Integer Sequences

    Time limit : 2sec / Memory limit : 256MB

    Score : 800 points

    Problem Statement

    In Finite Encyclopedia of Integer Sequences (FEIS), all integer sequences of lengths between 1 and N (inclusive) consisting of integers between 1 and K (inclusive) are listed.

    Let the total number of sequences listed in FEIS be X. Among those sequences, find the (X⁄2)-th (rounded up to the nearest integer) lexicographically smallest one.

    Constraints

    • 1≤N,K≤3×105
    • N and K are integers.

    Input

    Input is given from Standard Input in the following format:

    K N
    

    Output

    Print the (X⁄2)-th (rounded up to the nearest integer) lexicographically smallest sequence listed in FEIS, with spaces in between, where X is the total number of sequences listed in FEIS.


    Sample Input 1

    Copy
    3 2
    

    Sample Output 1

    Copy
    2 1 
    

    There are 12 sequences listed in FEIS: (1),(1,1),(1,2),(1,3),(2),(2,1),(2,2),(2,3),(3),(3,1),(3,2),(3,3). The (12⁄2=6)-th lexicographically smallest one among them is (2,1).


    Sample Input 2

    Copy
    2 4
    

    Sample Output 2

    Copy
    1 2 2 2
    

    Sample Input 3

    Copy
    5 14
    

    Sample Output 3

    Copy
    3 3 3 3 3 3 3 3 3 3 3 3 2 2 

    题解:偶数的时候很好弄,输出k/2,k...k,奇数的时候,对与k/2.k/2 ...k/2 这个序列 里中间最近,与中间相差n/2 (证明 or 官方题解)个,即往前模拟

    code:

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    const int N = 3e5 + 10;
    const int mod = 1e9 + 7;
    int a[N];
    int main()
    {
        int n,k;
        scanf("%d%d",&k,&n);
        if(k&1)
        {
            for(int i = 1;i <= n;i++)
                a[i] = (k+1)/2;
            int m = n;
            for(int i = 1;i <= n/2;i++)
            {
                if(a[m] == 1)
                    m--;
                else
                {
                    a[m]--;
                    for(int j = m + 1;j <= n;j++)
                        a[j] = k;
                    m = n;
                }
            }
            for(int i = 1;i <= m;i++)
                printf("%d%c",a[i],i == m?'
    ':' ');
        }
        else
        {
            for(int i = 1;i <= n;i++)
                printf("%d%c",i == 1?k/2:k,i == n?'
    ':' ');
        }
        return 0;
    }
  • 相关阅读:
    面向对象之继承
    面向对象之封装
    进程相关(一)
    面向对象之反射,元类
    实现效果从中间变大
    如何扒一个网站
    java例程练习(引用类型数据的排序和查找)[外篇]
    java例程练习(Iterator)
    java例程练习(增强的for循环)
    java例程练习(Map接口及自动打包、解包)
  • 原文地址:https://www.cnblogs.com/lemon-jade/p/9417407.html
Copyright © 2011-2022 走看看