评测记录
题目
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5;
long long n,m,a[N];
long long b[N];
long long kangtuo(){
long long ans=0;
for(int i=1;i<=n;i++){
long long count=0,f=1,x=1;
for(int j=i+1;j<=n;j++){
if(a[i]>a[j]) count++;
f*=x++;
}
ans+=f*count;
}
return ans+1;
}
void nikangtuo(long long len){
len--;
bool v[N];
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++){
long long k=len/b[n-i];
len=len%b[n-i];
long long ans=0;
for(int j=1;j<=n;j++){
if(!v[j]){
ans++;
if(ans==k+1){
a[i]=j;
v[j]=1;
break;
}
}
}
}
for(int i=1;i<=n;i++) printf("%lld ",a[i]);
printf("\n");
}
int main(){
b[0]=1;
for(int i=1;i<=N;i++) b[i]=b[i-1]*i;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
long long ans=kangtuo()+m;
nikangtuo(ans);
return 0;
}