[Все темы по размещениям]
Теория: Окулов. Программирование в алгоритмах. 2004
Практика: [3784. Генерация размещений]
Ранее мы рассмотрели получение номера по размещению за O(N*N). В данной же задаче нужно сделать все с точностью до наоборот:
- int placement_amount(int n, int m) {
- int res = 1;
- for (int i = n; i >= n-m+1; --i) {
- res *= i;
- }
- return res;
- }
- void gen_placement_by_num(int num, int n, int m, vector<int> &mas) {
- vector<bool> usd(n,false);
- int _n = n-1, _m = m-1;
- for (int i=0;i<m;++i) {
- int block_cnt = num / placement_amount(_n,_m);
- num -= block_cnt * placement_amount(_n,_m);
- int pos = 0;
- ++block_cnt;
- while (block_cnt) {
- if (!usd[pos])
- --block_cnt;
- ++pos;
- }
- usd[pos-1] = true;
- mas[i] = pos;
- --_n; --_m;
- }
- }
* This source code was highlighted with Source Code Highlighter.
При многократном вызове функции gen_placement_by_num можно сделать препроцессинг и не использовать функцию placement_amount.
Комментариев нет:
Отправить комментарий