Advertisement
a53

Inrudit

a53
May 19th, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.05 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. FILE *fin = fopen("inrudit.in", "r"), *fout = fopen("inrudit.out", "w");
  4. #define INF 1000000001
  5. int fr[10], comb[1001][1001];
  6. int s[1001], d[1002];
  7.  
  8. inline int f(int x)
  9. {
  10. fr[x]--;
  11. int r = 1, c = 0;
  12. for (int j = 0; j < 10; j++)
  13. {
  14. r = std::min(1LL * INF, 1LL * comb[c + fr[j]][c] * r);
  15. c += fr[j];
  16. }
  17. fr[x]++;
  18. return r;
  19. }
  20.  
  21. inline void solve(int k)
  22. {
  23. int cnt = 0;
  24. for (int i = 0; i < 10; i++)
  25. cnt += fr[i];
  26. for (int i = 0; i < cnt; i++)
  27. {
  28. int x = 0;
  29. while (fr[x] == 0 || f(x) < k)
  30. {
  31. if (fr[x])
  32. k -= f(x);
  33. x++;
  34. }
  35. fputc(x + '0', fout);
  36. fr[x]--;
  37. }
  38. }
  39.  
  40. int main()
  41. {
  42. int k;
  43. fscanf(fin, "%d ", &k);
  44. char ch = fgetc(fin);
  45. int n = 0;
  46. while (ch != '\n')
  47. {
  48. s[++n] = ch - '0';
  49. if (k == 0)
  50. fputc(ch, fout);
  51. ch = fgetc(fin);
  52. }
  53. if (k == 0)
  54. return 0;
  55. for (int i = 0; i <= n; i++)
  56. {
  57. comb[i][0] = 1;
  58. for (int j = 1; j <= i; j++)
  59. comb[i][j] = std::min(INF, comb[i - 1][j - 1] + comb[i - 1][j]);
  60. }
  61. for (int i = n; i > 0; i--)
  62. {
  63. d[i] = d[i + 1];
  64. fr[s[i]]++;
  65. for (int x = s[i] + 1; x < 10; x++)
  66. if (fr[x] > 0)
  67. d[i] = std::min(INF, d[i] + f(x));
  68. }
  69. if (d[1] < k)
  70. fprintf(fout, "-1\n");
  71. else
  72. {
  73. int poz = 1;
  74. while (d[poz] >= k)
  75. {
  76. fr[s[poz]]--;
  77. poz++;
  78. }
  79.  
  80. k -= d[poz];
  81. poz--;
  82. fr[s[poz]]++;
  83.  
  84. int x = s[poz] + 1;
  85. while (fr[x] == 0 || k > f(x))
  86. {
  87. if (fr[x])
  88. k -= f(x);
  89. x++;
  90. }
  91. fr[x]--;
  92. for (int i = 1; i < poz; i++)
  93. fputc(s[i] + '0', fout);
  94. fputc(x + '0', fout);
  95.  
  96. solve(k);
  97. }
  98. fclose(fin);
  99. fclose(fout);
  100. return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement