题面
首先若k是偶数,答案显然是k/2,k,k,k……
若k是奇数,我们考虑这样一个序列B:k/2,k/2,k/2……的排名。
构造一个映射f(X)->X’,X是一个序列,X’是每个Xi替换成k-Xi+1后的序列,这显然是一个一一映射,那么除了X是B的前缀以外,每个X和X’的排名都是一个再B前,一个再B后。那么B的排名就是(S+1)/2+N/2,S为数列总个数。
于是从B往前倒推N/2个即是答案。
代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n,k;
int a[300010];
int main()
{
scanf("%d%d",&k,&n);
if(k&1)
{
for(int i=1;i<=n;i++)
a[i]=(k+1)/2;
int last=n;
for(int i=1;i<=n/2;i++)
if(a[last]==1) last--;
else
{
a[last]--;
for(int j=last+1;j<=n;j++)
a[j]=k;
last=n;
}
for(int i=1;i<=last;i++)
printf("%d ",a[i]);
}
else
{
printf("%d ",k/2);
for(int i=2;i<=n;i++)
printf("%d ",k);
}
return 0;
}