Inversion
64-bit integer IO format: %lld Java class name: Main
The inversion number of an integer sequence a1, a2, ... , an is the number of pairs (ai, aj) that satisfy i < j and ai > aj. Given n and the inversion number m, your task is to find the smallest permutation of the set { 1, 2, ... , n }, whose inversion number is exactly m.
A permutation a1, a2, ... , an is smaller than b1, b2, ... , bn if and only if there exists an integer k such that aj = bj for 1 <= j < k but ak < bk.
Input
The input consists of several test cases. Each line of the input contains two integers n and m. Both of the integers at the last line of the input is -1, which should not be processed. You may assume that 1 <= n <= 50000 and 0 <= m <= 1/2*n*(n-1).
Output
For each test case, print a line containing the smallest permutation as described above, separates the numbers by single spaces. Don't output any trailing spaces at the end of each line, or you may get an 'Presentation Error'!
Sample Input
5 9
7 3
-1 -1
Sample Output
4 5 3 2 1
1 2 3 4 7 6 5
Source
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 vector<int>ans; 5 int main(){ 6 while(scanf("%d %d",&n,&m),~n||~m){ 7 ans.clear(); 8 int p = 1; 9 for(; p*(p - 1) < (m<<1); p++); 10 for(int i = 1; i <= n - p; ++i) ans.push_back(i); 11 int tmp = n - p + (m - ((p-1)*(p-2)>>1)) + 1; 12 ans.push_back(tmp); 13 for(int i = n; i > n - p; --i) 14 if(i != tmp) ans.push_back(i); 15 for(int i = 0; i < ans.size(); ++i) 16 printf("%d%c",ans[i],i + 1 == ans.size()?' ':' '); 17 } 18 return 0; 19 }