输入第一行两个数,第一个数表示序列有多少个元素,第二个数表示要输出这个序列前面的第K个。
第二行有N个数,表示序列。序列中只有从1到N工N个数
以0 0结束输入
代码如下:
/*
样例输入
5 4
4 1 3 2 5
5 1
1 2 3 4 5
5 119
5 4 3 2 1
0 0
样例输出
3 5 4 1 2
-1
1 2 3 4 5
*/
#include<iostream>
#include<cstdio>
using namespace std;
__int64 A(int n){
if(n==0)return 1;
__int64 ret=1;
for(int i=2;i<=n;++i){
ret*=i;
}
return ret;
}
int cnt[25];
__int64 ori[25];
int visit[25];
int main(){
freopen("data.txt","r",stdin);
ios::sync_with_stdio(false);
int n;
__int64 k;
while(cin>>n>>k){
if(n==0&&k==0)break;
__int64 pos=0;
for(int i=1;i<=n;++i){
cin>>ori[i];
cnt[i]=i;
}
for(int i=1;i<=n;++i){
int top=ori[i];
pos+=(A(n-i)*(cnt[top]-1));
for(int t=top;t<=n;++t){
cnt[t]--;
}
}
pos++;
if(pos<=k){cout<<-1<<endl;continue;}
/
// cout<<pos<<endl;
pos-=k;
// cout<<"pos="<<pos<<endl;
memset(visit,0,sizeof(visit));
// for(int i=1;i<=n;++i){
// cnt[i]=i;
// }
for(int i=1;i<=n;++i){
__int64 v=A(n-i);
// cout<<"pos="<<pos<<' '<<"v="<<v<<"n,i "<<n<<' '<<i<<endl;
__int64 tmp=pos/v;
if(pos%v)
tmp++;
pos=pos-v*(tmp-1);
int d=0;
int dis;
// cout<<"tmp="<<tmp<<endl;
for(dis=1;dis<=n;++dis){
if(!visit[dis])d++;
if(d==tmp)break;
}
// cout<<"d="<<d<<' '<<"dis="<<dis<<endl;
ori[i]=dis;
visit[dis]=1;
// for(int t=dis;t<=n;++t){
// cnt[t]--;
// }
}
for(int i=1;i<=n;++i){
cout<<ori[i]<<' ';
}
cout<<endl;
}
return 0;
}