fork download
  1. #include <iostream>
  2. #include <numeric>
  3. #include <vector>
  4. #include <boost/multiprecision/cpp_int.hpp>
  5.  
  6. using namespace std;
  7. using BigInt = boost::multiprecision::cpp_int;
  8.  
  9. BigInt factorial(unsigned int n)
  10. {
  11. BigInt f = 1;
  12. while (n) f *= n--;
  13. return f;
  14. }
  15.  
  16. BigInt power(BigInt m, unsigned int n)
  17. {
  18. BigInt p = 1;
  19. while (n--) p *= m;
  20. return p;
  21. }
  22.  
  23. vector<int> ithDuplicatedPermutation(int n, int m, BigInt i)
  24. {
  25. vector<int> c(n);
  26. fill(c.begin(), c.end(), m);
  27.  
  28. int N = m * n;
  29. vector<int> a(N);
  30.  
  31. BigInt P = factorial(N) / power(factorial(m), n);
  32.  
  33. for (int j = 0; j < N; j++) {
  34. for (int k = 0; k < n; k++) {
  35. if (!c[k]) continue;
  36. BigInt p = P * c[k] / (N - j);
  37. if (i <= p) {
  38. a[j] = k + 1;
  39. c[k]--;
  40. P = p;
  41. break;
  42. }
  43. i -= p;
  44. }
  45. }
  46.  
  47. return a;
  48. }
  49.  
  50. template <typename T> ostream &operator<<(ostream &os, const vector<T> &v)
  51. {
  52. cout << "[";
  53. for (auto &x : v) os << (&x == &v[0] ? "" : ", ") << x;
  54. cout << "]";
  55. return os;
  56. }
  57.  
  58. pair<vector<int>, vector<BigInt>> Q[] = {
  59. {{9, 1}, {1, 2, 3, 123456, 234567, 362880}},
  60. {{4, 3}, {1, 2, 3, 123456, 234567, 369600}},
  61. {{5, 3}, {1, 2, 3, 123456, 234567, 369600, 168168000}},
  62. {{10, 5}, {1, 2, 3, 123456, 234567, (BigInt)"49120458506088132224064306071170476903628800"}}
  63. };
  64.  
  65. int main(void)
  66. {
  67. for (auto &q : Q) {
  68. int n = q.first[0], m = q.first[1];
  69. cout << "【n = " << n << ", m = " << m << "】" << endl << endl;
  70. for (BigInt &i : q.second) {
  71. cout << "入力: " << i << endl;
  72. cout << "出力: " << ithDuplicatedPermutation(n, m, i) << endl << endl;
  73. }
  74. cout << endl;
  75. }
  76.  
  77. return 0;
  78. }
Success #stdin #stdout 0.01s 5324KB
stdin
Standard input is empty
stdout
【n = 9, m = 1】

入力: 1
出力: [1, 2, 3, 4, 5, 6, 7, 8, 9]

入力: 2
出力: [1, 2, 3, 4, 5, 6, 7, 9, 8]

入力: 3
出力: [1, 2, 3, 4, 5, 6, 8, 7, 9]

入力: 123456
出力: [4, 1, 6, 5, 8, 9, 7, 3, 2]

入力: 234567
出力: [6, 8, 4, 7, 5, 3, 2, 1, 9]

入力: 362880
出力: [9, 8, 7, 6, 5, 4, 3, 2, 1]


【n = 4, m = 3】

入力: 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]


【n = 5, m = 3】

入力: 1
出力: [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5]

入力: 2
出力: [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 4, 5, 5]

入力: 3
出力: [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 4, 5]

入力: 123456
出力: [1, 1, 1, 3, 3, 3, 4, 4, 2, 5, 4, 5, 2, 2, 5]

入力: 234567
出力: [1, 1, 1, 4, 3, 5, 5, 3, 5, 4, 4, 2, 2, 2, 3]

入力: 369600
出力: [1, 1, 1, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2]

入力: 168168000
出力: [5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1, 1, 1]


【n = 10, m = 5】

入力: 1
出力: [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10]

入力: 2
出力: [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 9, 10, 10, 10, 10]

入力: 3
出力: [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 9, 10, 10, 10]

入力: 123456
出力: [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 9, 9, 10, 10, 8, 8, 9, 8, 8, 9, 10, 10, 10, 9]

入力: 234567
出力: [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 10, 10, 9, 8, 8, 9, 10, 10, 8, 9, 10, 9, 8, 9]

入力: 49120458506088132224064306071170476903628800
出力: [10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1]