原题: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;
}