Advertisement
a53

Partit

a53
Mar 11th, 2020
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.88 KB | None | 0 0
  1. /// stud. Theodor-Pierre Moroianu
  2. /// Universitatea Bucuresti
  3.  
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6.  
  7. typedef long long i64;
  8. const i64 inf = 2LL * 1000000000 * 1000000000;
  9.  
  10. vector <i64> calc_dp(int nr)
  11. {
  12. // dp[i] = in cate moduri pot imparti suma i
  13. // dp[0] = 1
  14. // dp[i] = sum(dp[<i])
  15. // -> dp[k] = (2 ** k) - 1 | k > 0
  16.  
  17. vector <i64> dp(nr + 1);
  18. dp[0] = dp[1] = 1;
  19.  
  20. for (int i = 2; i <= nr; i++)
  21. dp[i] = min(inf, 2 * dp[i - 1]);
  22.  
  23. return dp;
  24. }
  25.  
  26. vector <int> partition(int n, i64 ord)
  27. {
  28. auto dp = calc_dp(n);
  29. vector <int> ans;
  30.  
  31. while (n > 0) {
  32. assert(dp[n] >= ord);
  33.  
  34. int act = 1; // cate scot
  35. while (dp[n - act] < ord)
  36. ord -= dp[n - act], act++;
  37.  
  38. /// trebuie sa scot act
  39. assert(act <= n);
  40. ans.push_back(act);
  41. n -= act;
  42. }
  43.  
  44. assert(ord == 1 && n == 0);
  45.  
  46. return ans;
  47. }
  48.  
  49. i64 order(int n, vector <int> partition)
  50. {
  51. auto dp = calc_dp(n);
  52. i64 ord = 1;
  53.  
  54. for (auto i : partition) {
  55. for (int j = 1; j < i; j++)
  56. assert((ord += dp[n - j]) < inf);
  57. assert((n -= i) >= 0);
  58. }
  59.  
  60. assert(n == 0);
  61.  
  62. return ord;
  63. }
  64.  
  65. int main()
  66. {
  67. ifstream in("partit.in");
  68. ofstream out("partit.out");
  69.  
  70. int cerinta, n;
  71. in >> cerinta >> n;
  72.  
  73. assert((cerinta == 1 || cerinta == 2) && (n >= 1 && n <= 10000));
  74.  
  75. if (cerinta == 1) {
  76. i64 ord;
  77. in >> ord;
  78.  
  79. assert(1 <= ord && ord < inf);
  80.  
  81. auto ans = partition(n, ord);
  82. for (auto i : ans)
  83. out << i << ' ';
  84. out << '\n';
  85. }
  86. else {
  87. vector <int> part;
  88. int x;
  89. while (in >> x)
  90. part.push_back(x);
  91.  
  92. i64 ord = order(n, part);
  93. out << ord << '\n';
  94. }
  95.  
  96. in.close();
  97. out.close();
  98.  
  99. return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement