Advertisement
Nik_Perepelov

13 контест Александру

Dec 13th, 2021
875
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. // 1
  2.  
  3. #include <iostream>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. int const FACTORIAL[13] =
  9.         {
  10.                 1, 1, 2,
  11.                 6, 24, 120,
  12.                 720, 5040, 40320,
  13.                 362880, 3628800, 39916800,
  14.                 479001600
  15.         };
  16.  
  17.  
  18. class Task {
  19.     vector<int> res_perm;
  20.     vector<bool> used;
  21.  
  22. public:
  23.  
  24.     Task(int n) {
  25.         res_perm.resize(n);
  26.         used.resize(n + 1);
  27.     }
  28.  
  29.     void solve(int n, int k) {
  30.         for (int i = 0; i < n; i++) {
  31.             int j = 1, pos = 0, skip = 1 + (k - 1) / FACTORIAL[n - i - 1];
  32.             for (; j <= n; j++) {
  33.                 if (!used[j]) {
  34.                     pos += 1;
  35.                 }
  36.                 if (skip == pos) {
  37.                     break;
  38.                 }
  39.             }
  40.             k = 1 + (k - 1) % FACTORIAL[n - i - 1];
  41.             res_perm[i] = j;
  42.             used[j] = true;
  43.         }
  44.         for (auto &i: res_perm)
  45.             cout << i << ' ';
  46.     }
  47.  
  48. };
  49.  
  50. int main() {
  51.     int n, k;
  52.     cin >> n >> k;
  53.     Task task(n);
  54.     task.solve(n, k);
  55.     return 0;
  56. }
  57.  
  58. //2
  59.  
  60. #include <iostream>
  61. #include <vector>
  62.  
  63. using namespace std;
  64.  
  65.  
  66.  
  67. class Task{
  68.  
  69.     vector<int> answer;
  70.  
  71. public:
  72.  
  73.     void solve(int i, int n, int k) {
  74.         if (k == 0) {
  75.             for (auto &i : answer)
  76.                 cout << i << " ";
  77.             cout << endl;
  78.         } else {
  79.             for (int j = i; j <= n - k; j++) {
  80.                 answer.push_back(j + 1);
  81.                 solve(j + 1, n, k - 1);
  82.                 answer.pop_back();
  83.             }
  84.         }
  85.     }
  86. };
  87.  
  88. int main() {
  89.     int n, k;
  90.     cin >> n >> k;
  91.  
  92.     Task task;
  93.     task.solve(0, n, k);
  94.  
  95.     return 0;
  96. }
  97.  
  98. //3
  99.  
  100. #include <iostream>
  101. #include <vector>
  102.  
  103. using namespace std;
  104.  
  105.  
  106. class Task {
  107.  
  108.     vector<int> answer;
  109.     vector<bool> used;
  110.  
  111. public:
  112.  
  113.  
  114.     Task(int n, int k){
  115.         answer.resize(k);
  116.         used.resize(n);
  117.     }
  118.  
  119.     void solve(int n, int k, int m) {
  120.         int a = n - 1,  b = k - 1;
  121.         for (int i = 0; i < k; i++) {
  122.             int amount = 1;
  123.             for (int j = a; j >= a - b + 1; j--) {
  124.                 amount *= j;
  125.             }
  126.             a--;
  127.             b--;
  128.             int block = m / amount, position = 0;
  129.             m -= block * amount;
  130.             block++;
  131.             while (block) {
  132.                 if (!used[position]) {
  133.                     block--;
  134.                 }
  135.                 position++;
  136.             }
  137.             answer[i] = position;
  138.             used[position - 1] = true;
  139.         }
  140.  
  141.         for (auto &i : answer)
  142.             cout << i << " ";
  143.     }
  144. };
  145.  
  146. int main() {
  147.     int n, k, m;
  148.     cin >> n >> k >> m;
  149.     Task task(n, k);
  150.     task.solve(n, k, m - 1);
  151.  
  152.     return 0;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement