说实话我真没思路
#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的问题。 虽然这个题解有点问题,但是 //解决了我按权给值加逆序对的问题。就是能用小的解决的绝不用大的,既然用大的说明不能用小的替代只好用他的最大价值