Atcoder - Finite Encyclopedia of Integer Sequences

原题:Finite Encyclopedia of Integer Sequences

原题大意

给出两个数K,N, 表示数列的取值范围为1~K,N表示数列长度的取值范围为1~N,问这样的所有序列按照字典序排序,第(X/2)个序列是什么

算法分析

如果是K是偶数,该序列一定是这样的:第一个数是(K/2),然后跟着(N-1)个K。
如果是奇数,先看到这样一个序列B:n个(K+1)/2构成,排在这个序列之前的序列和排在这个序列之后的序列,他们的关系是满足函数(K+1-Xi)的(比如K=5时, 1234,4321),但是个数却不是相等的(比如K=5时, 3333只有一个,在前半段),所以前后序列差为(N-1),从B开始往前数(N-1)/2个。

程序代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int n, k;

void solve(int num){
    stack<int> s;
    int t = (k+1)/2;
    for(int i = 0; i < n; i++) s.push(t);
    while(num--){
        int temp = s.top();
        s.pop();
        if(temp == 1);
        else{
            s.push(temp-1);
            if(s.size() < n)
                while(s.size() != n)
                    s.push(k);
        }
    }
    vector<int> v;
    while(!s.empty()){
        v.push_back(s.top());
        s.pop();
    }
    reverse(v.begin(), v.end());
    for(int i = 0; i < v.size()-1; i++){
        cout << v[i] << " ";
    }
    if(v.size() >= 1) cout << v[v.size()-1];
}
int main(){

    while(cin >> k >> n){
        if(!(k & 1)){
            cout << k/2 << " ";
            for(int i = 0; i < n - 2; i++){
                cout << k << " ";
            }
            if(n-1 > 0) cout << k;
        }
        else{
            solve(ceil((n-1)/2.0));
        }
        cout << endl;
    }
    return 0;
}