Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstdlib>
- #include<algorithm>
- #include<vector>
- #define long long long
- #define nln '\n'
- using namespace std;
- long factorial(long n)
- {
- if (n <= 1)
- return 1;
- return factorial(n-1)*n;
- }
- void transform(vector<long> &a)
- {
- vector<pair<long, long>> b;
- for (long i = 0; i < (long)a.size(); ++i)
- b.push_back({a[i], i+1});
- sort(b.begin(), b.end());
- vector<pair<long, long>> ord;
- for (long i = 0; i < (long)a.size(); ++i)
- ord.push_back({b[i].second, i+1});
- sort(ord.begin(), ord.end());
- for (long i = 0; i < (long)a.size(); ++i)
- a[i] = ord[i].second;
- }
- long find_id(long n, vector<long> a)
- {
- long res = 0;
- while (a.size() > 1){
- res += (a[0]-1)*factorial(--n);
- a.erase(a.begin());
- transform(a);
- }
- return res+a[0];
- }
- vector<long> find_permutation(long id, long n)
- {
- vector<long> a, b;
- for (long i = 0; i < n; ++i)
- b.push_back(i+1);
- while (id > 0){
- long dgt = id/factorial(--n);
- id %= factorial(n);
- if (id == 0)
- --dgt;
- a.push_back(b[dgt]);
- b.erase(b.begin()+dgt);
- }
- while (!b.empty()){
- a.push_back(b.back());
- b.pop_back();
- }
- return a;
- }
- int main()
- {
- cin.tie(0)->sync_with_stdio(0);
- cout.tie(0)->sync_with_stdio(0);
- //freopen("shhv.inp", "r", stdin);
- //freopen("shhv.out", "w", stdout);
- vector<long> a;
- long n;
- while (cin >> n)
- a.push_back(n);
- long p = a.back();
- a.pop_back();
- n = a.size();
- cout << find_id(n, a) << nln;
- a = find_permutation(p, n);
- for (const auto i : a)
- cout << i << ' ';
- cout << nln;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment