#include <iostream> #include <numeric> #include <vector> using namespace std; int factorial(unsigned int n) { int f = 1; while (n) f *= n--; return f; } int power(int m, unsigned int n) { int p = 1; while (n--) p *= m; return p; } vector<int> ithDuplicatedPermutation(int n, int m, int i) { vector<int> c(n); fill(c.begin(), c.end(), m); int N = n * m; vector<int> a(N); for (int j = 0; j < N; j++) { int P1 = factorial(N - j - 1), P2 = 1; for (int k = 0; k < n; k++) P2 *= factorial(c[k]); for (int k = 0; k < n; k++) { if (!c[k]) continue; int p = P1 / (P2 / c[k]); if (i <= p) { a[j] = k + 1; c[k]--; break; } i -= p; } } return a; } template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) { cout << "["; for (auto &x : v) os << (&x == &v[0] ? "" : ", ") << x; cout << "]"; return os; } int main(void) { for (int n : {1, 2, 3, 123456, 234567, 369600}) { cout << "入力: " << n << endl; cout << "出力: " << ithDuplicatedPermutation(4, 3, n) << endl << endl; } return 0; }
Standard input is empty
入力: 1 出力: [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 入力: 2 出力: [1, 1, 1, 2, 2, 2, 3, 3, 4, 3, 4, 4] 入力: 3 出力: [1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 3, 4] 入力: 123456 出力: [2, 2, 2, 3, 3, 1, 4, 3, 4, 1, 1, 4] 入力: 234567 出力: [3, 2, 4, 4, 2, 4, 3, 3, 1, 1, 1, 2] 入力: 369600 出力: [4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1]