说实话我真没思路
#include <iostream>
#include <cstdio>
using namespace std;
long long n,m,a[50002],num,last,fir;
int main(){
scanf("%lld%lld",&n,&m);
last=n;fir=1;
for(int i=1;i<=n;i++){
long long num=(long long)((n-i-1)*(n-i))/2;//全排列数量
if(num>=m)
a[fir++]=i;
if(num<m) a[last--]=i,m=m-(last-fir+1);
}
for(int i=1;i<=n;i++)
printf("%lld ",a[i]);
return 0;
}//long long的问题,50,100。last和fir的问题。 虽然这个题解有点问题,但是
//解决了我按权给值加逆序对的问题。就是能用小的解决的绝不用大的,既然用大的说明不能用小的替代只好用他的最大价值