Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #define ll long double
- using namespace std;
- ll factorial(ll n){
- int r = 1;
- for (int i = 2; i < n + 1; ++i){
- r *= i;
- }
- return r;
- }
- int acc(ll n, ll k){
- return factorial(n) / factorial(n - k);
- }
- int pos_from_acc(int n, int k, vector<int> accommodation){
- int position = 0;
- bool used[n];
- for (int i = 0; i < n; ++i){
- used[i] = false;
- }
- for (int i = 0; i < k; ++i){
- int count = 0;
- for (int j = 0; j < accommodation[i]; ++j) {
- count += used[j] ? 1 : 0;
- }
- position += (accommodation[i] - count - 1) * acc(n - 1 - i, k - 1 - i);
- used[accommodation[i]] = true;
- }
- return ++position;
- }
- int firstUnused(const bool used[])р{
- for (int i = 1; i < sizeof(used); ++i){
- if (!used[i]){
- return i;
- }
- }
- }
- vector<int> acc_from_pos(int n, int k, int position){
- bool used[n + 1];
- for (int i = 0; i < n + 1; ++i){
- used[i] = false;
- }
- vector<int> accommodation;
- --position;
- for (int i = 0; i < k; ++i){
- int x = firstUnused(used) + position / acc(n - 1 - i, k - 1 - i);
- while(true){
- if (!used[x]){
- break;
- } else {
- ++x;
- }
- }
- accommodation.emplace_back(x);
- used[x] = true;
- position = position % acc(n - 1 - i, k - 1 - i);
- }
- return accommodation;
- }
- int main() {
- int n, k;
- cin >> n >> k;
- vector<int> accommodation;
- for (int i = 0; i < k; ++i){
- int x;
- cin >> x;
- accommodation.emplace_back(x);
- }
- int pos = pos_from_acc(n, k, accommodation);
- ++pos;
- cout << pos << '\n';
- accommodation = acc_from_pos(n, k, pos);
- for (int i : accommodation){
- cout << i << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement