# Разбор задач 2022 года Если Вы не знали, как решать какую-то задачу, и Вам было лень разбираться в коде на Pascal, то это пост специально для Вас. :::warning Убедительная просьба не копировать коды и не пересылать их. Помните -- Вы решаете задачи для себя! ::: ## [1. Порядок различных значений](https://codeforces.com/group/skz9fIV5Hq/contest/409232/problem/A) :::spoiler Разбор :::info Отсортируем массив и пройдём по всем его элементам. Будем уменьшать $k$ на $1$ если предыдущий элемент не равен текущему. Если $k$ стало равно $0$, то текущий элемент является ответом. Чтобы вводить массив размером $10^6$ необходимо использовать быстрый ввод. Асимптотика: $O(n*log(n))$ ::: :::spoiler Код (C++, автор: [andrewns](https://codeforces.com/profile/andrewns)) ```cpp #include <bits/stdc++.h> using namespace std; typedef long long ll; ll arr[1000002]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n, k; cin >> n >> k; for(ll i = 0; i < n; i ++) { cin >> arr[i]; } sort(arr, arr + n); for(ll i = 0; i < n; i ++) { if(i == 0 || arr[i] != arr[i - 1]) { k --; } if(k == 0) { cout << arr[i]; return 0; } } cout << -1; } ``` ::: ## [2. Количество перестановок](https://codeforces.com/group/skz9fIV5Hq/contest/409232/problem/B) :::spoiler Разбор :::info Давайте найдём бинарным поиском максимальное $x$ такое, что лексикографически $x$-ая перестановка числа $N$ меньше либо равна числу $M$, и максимальное $y$ такое, что в лексикографически $y$-ой перестановке числа $N$ есть лидирующий ноль. Тогда ответ это $max(0, x-y)$. Как найти лексикографически $k$-ую перестановку числа $N$? Давайте расставлять цифры слева направо, и для каждой позиции перебирать цифру от $0$ до $9$. Пусть на позицию $i$ мы пытаемся поставить цифру $j$. Тогда найдём количество перестановок с повторениями на суффиксе $[i + 1; |N|]$. Если оно больше либо равно $k$, то на позиции $i$ должна стоять цифра $j$, иначе отнимем его от $k$ и перейдём к следующей цифре. Асимптотика: $O(|N| * 10 * log(|N|))$ ::: :::spoiler Код (C++, автор: [andrewns](https://codeforces.com/profile/andrewns)) ```cpp #include <bits/stdc++.h> using namespace std; typedef long long ll; ll fact[16]; ll P(vector<ll> kol) { ll sum = 0, dv = 1; for(ll i : kol) { sum += i; dv *= fact[i]; } return fact[sum] / dv; } string get_kth(vector<ll> kol, ll k) { ll n = 0; for(ll i : kol) { n += i; } string s(n, '0'); for(ll i = 0; i < n; i ++) { for(int j = 0; j <= 9; j ++) { if(kol[j] == 0) continue; kol[j] --; if(P(kol) >= k) { s[i] = char(j + '0'); break; } else { k -= P(kol); kol[j] ++; } } } return s; } int main() { string n, m; cin >> n >> m; fact[0] = 1; for(ll i = 1; i <= 15; i ++) { fact[i] = fact[i - 1] * i; } vector<ll> kol(10, 0); for(char i : n) { kol[i - '0'] ++; } ll l = 0, r = P(kol); while(l < r) { ll mid = (l + r + 1) / 2; string s = get_kth(kol, mid); if(s.length() < m.length() || (s.length() == m.length() && s <= m)) { l = mid; } else r = mid - 1; } ll lx = 0, rx = P(kol); while(lx < rx) { ll mid = (lx + rx + 1) / 2; if(get_kth(kol, mid)[0] == '0') { lx = mid; } else rx = mid - 1; } cout << max(0ll, l - lx); } ``` :::