fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. // Hàm tính số thứ tự của một hoán vị
  7. int permutationToIndex(const vector<int>& perm) {
  8. int n = perm.size();
  9. vector<bool> used(n + 1, false);
  10. int index = 0;
  11. long long factorial = 1;
  12.  
  13. for (int i = 1; i <= n; ++i) {
  14. factorial *= i; // Tính giai thừa
  15. }
  16.  
  17. for (int i = 0; i < n; ++i) {
  18. factorial /= (n - i); // Giảm cấp giai thừa
  19.  
  20. // Đếm số lượng phần tử nhỏ hơn perm[i] mà chưa được sử dụng
  21. int rank = 0;
  22. for (int j = 1; j < perm[i]; ++j) {
  23. if (!used[j]) {
  24. rank++;
  25. }
  26. }
  27.  
  28. // Cộng dồn vào chỉ số
  29. index += rank * factorial;
  30.  
  31. // Đánh dấu phần tử này đã được sử dụng
  32. used[perm[i]] = true;
  33. }
  34.  
  35. return index + 1; // Chỉ số bắt đầu từ 1
  36. }
  37.  
  38. // Hàm tìm hoán vị từ số thứ tự
  39. vector<int> indexToPermutation(int n, int y) {
  40. vector<int> permutation;
  41. vector<int> elements(n);
  42. for (int i = 0; i < n; ++i) {
  43. elements[i] = i + 1;
  44. }
  45.  
  46. long long factorial = 1;
  47. for (int i = 1; i <= n; ++i) {
  48. factorial *= i; // Tính giai thừa
  49. }
  50.  
  51. y--; // Chuyển sang chỉ số bắt đầu từ 0
  52.  
  53. for (int i = 0; i < n; ++i) {
  54. factorial /= (n - i); // Giảm cấp giai thừa
  55.  
  56. // Tìm chỉ số của phần tử cần chọn
  57. int index = y / factorial;
  58. permutation.push_back(elements[index]);
  59. elements.erase(elements.begin() + index);
  60.  
  61. // Cập nhật y
  62. y %= factorial;
  63. }
  64.  
  65. return permutation;
  66. }
  67.  
  68. int main() {
  69. ios_base::sync_with_stdio(false);
  70. cin.tie(0);
  71.  
  72. int n;
  73. vector<int> perm;
  74. while (cin >> n) {
  75. perm.push_back(n);
  76. }
  77.  
  78.  
  79.  
  80. int y;
  81. y = perm[perm.size() - 1];
  82.  
  83. perm.pop_back();
  84.  
  85. // Tính số thứ tự x của hoán vị
  86. int x = permutationToIndex(perm);
  87. cout << x << endl;
  88.  
  89. n = perm.size();
  90.  
  91. // Tìm hoán vị từ số thứ tự y
  92. vector<int> result = indexToPermutation(n, y);
  93. for (int num : result) {
  94. cout << num << " ";
  95. }
  96. cout << endl;
  97.  
  98. return 0;
  99. }
  100.  
Success #stdin #stdout 0.01s 5272KB
stdin
2 1 3 
4
stdout
3
2 3 1