fork download
  1. #include <iostream>
  2. #include <numeric>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. vector<int> ithPermutation(int n, int i)
  8. {
  9. vector<int> r(n);
  10. i--;
  11.  
  12. for (int j = 1; j <= n; j++) {
  13. r[n - j] = i % j;
  14. i /= j;
  15. }
  16.  
  17. vector<int> a(n);
  18. iota(a.begin(), a.end(), 1);
  19.  
  20. vector<int> p(n);
  21. for (int i = 0; i < n; i++) {
  22. p[i] = a[r[i]];
  23. a.erase(a.begin() + r[i]);
  24. }
  25. return p;
  26. }
  27.  
  28. template <typename T> ostream &operator<<(ostream &os, const vector<T> &v)
  29. {
  30. cout << "[";
  31. for (auto &x : v) os << (&x == &v[0] ? "" : ", ") << x;
  32. cout << "]";
  33. return os;
  34. }
  35.  
  36. int main(void)
  37. {
  38. for (int n : {1, 2, 3, 123456, 234567, 362880}) {
  39. cout << "入力: " << n << endl;
  40. cout << "出力: " << ithPermutation(9, n) << endl << endl;
  41. }
  42.  
  43. return 0;
  44. }
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
入力: 1
出力: [1, 2, 3, 4, 5, 6, 7, 8, 9]

入力: 2
出力: [1, 2, 3, 4, 5, 6, 7, 9, 8]

入力: 3
出力: [1, 2, 3, 4, 5, 6, 8, 7, 9]

入力: 123456
出力: [4, 1, 6, 5, 8, 9, 7, 3, 2]

入力: 234567
出力: [6, 8, 4, 7, 5, 3, 2, 1, 9]

入力: 362880
出力: [9, 8, 7, 6, 5, 4, 3, 2, 1]