Advertisement
Guest User

Untitled

a guest
Apr 2nd, 2020
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. #define ll long double
  5.  
  6. using namespace std;
  7.  
  8. ll factorial(ll n){
  9. int r = 1;
  10. for (int i = 2; i < n + 1; ++i){
  11. r *= i;
  12. }
  13. return r;
  14. }
  15.  
  16. int acc(ll n, ll k){
  17. return factorial(n) / factorial(n - k);
  18. }
  19.  
  20. int pos_from_acc(int n, int k, vector<int> accommodation){
  21. int position = 0;
  22. bool used[n];
  23. for (int i = 0; i < n; ++i){
  24. used[i] = false;
  25. }
  26.  
  27. for (int i = 0; i < k; ++i){
  28. int count = 0;
  29. for (int j = 0; j < accommodation[i]; ++j) {
  30. count += used[j] ? 1 : 0;
  31. }
  32. position += (accommodation[i] - count - 1) * acc(n - 1 - i, k - 1 - i);
  33. used[accommodation[i]] = true;
  34. }
  35.  
  36. return ++position;
  37. }
  38.  
  39. int firstUnused(const bool used[])р{
  40. for (int i = 1; i < sizeof(used); ++i){
  41. if (!used[i]){
  42. return i;
  43. }
  44. }
  45. }
  46.  
  47. vector<int> acc_from_pos(int n, int k, int position){
  48. bool used[n + 1];
  49. for (int i = 0; i < n + 1; ++i){
  50. used[i] = false;
  51. }
  52.  
  53. vector<int> accommodation;
  54.  
  55. --position;
  56. for (int i = 0; i < k; ++i){
  57. int x = firstUnused(used) + position / acc(n - 1 - i, k - 1 - i);
  58. while(true){
  59. if (!used[x]){
  60. break;
  61. } else {
  62. ++x;
  63. }
  64. }
  65. accommodation.emplace_back(x);
  66. used[x] = true;
  67. position = position % acc(n - 1 - i, k - 1 - i);
  68. }
  69. return accommodation;
  70. }
  71.  
  72.  
  73.  
  74. int main() {
  75. int n, k;
  76.  
  77. cin >> n >> k;
  78.  
  79. vector<int> accommodation;
  80.  
  81. for (int i = 0; i < k; ++i){
  82. int x;
  83. cin >> x;
  84. accommodation.emplace_back(x);
  85. }
  86.  
  87.  
  88. int pos = pos_from_acc(n, k, accommodation);
  89. ++pos;
  90. cout << pos << '\n';
  91.  
  92. accommodation = acc_from_pos(n, k, pos);
  93. for (int i : accommodation){
  94. cout << i << ' ';
  95. }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement