Advertisement
skimono

Untitled

Dec 8th, 2022
956
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. // clang-format off
  2. #define _CRT_SECURE_NO_WARNINGS
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <string>
  7. #include <algorithm>
  8. #include <cmath>
  9. #include <stack>
  10. #include <iomanip>
  11. #include <fstream>
  12. #include <string>
  13. #include <set>
  14. #include <deque>
  15. #include <queue>
  16. #include <map>
  17. #include <bitset>
  18. #include <random>
  19. #include <list>
  20. #include <unordered_map>
  21. #include <unordered_set>
  22. #include <cassert>
  23.  
  24. using namespace std;
  25.  
  26. typedef long long ll;
  27. typedef unsigned long long ull;
  28. typedef long double ld;
  29. typedef string str;
  30. //typedef __int128 ultraint;
  31. #define sqrt sqrtl
  32. #define F first
  33. #define S second
  34. #define endl '\n'
  35. #define all(vc666) vc666.begin(), vc666.end()
  36. #define allr(vc666) vc666.rbegin(), vc666.rend()
  37. #define int long long
  38. #define degug(x) cerr (#x) << " " << (x) << endl;
  39.  
  40. const ll INF = (ll)2e18 + 7;
  41. const ll inf = 1e9 + 7;
  42. const ll ONE = 1;
  43. const ll MOD = 1e9 + 7;
  44. ld EPS = 1e-12;
  45. ld PI = 3.1415926535897932384;
  46. mt19937_64 gen(3);
  47. unordered_map <int, int> res;
  48. //const ll max_sz = (1 << 20);
  49.  
  50. int rec(int n, int k) {
  51.     if (n == 1) {
  52.         return 1;
  53.     }
  54.     else if (k == 1) {
  55.         return (n + 1) / 2;
  56.     }
  57.     else {
  58.         int best = (n + 1) / 2;
  59.         for (int i = 3; i * i <= n; i++) {
  60.             if (n % i == 0) {
  61.                 if (res.find(n * 100 + k) != res.end()) {
  62.                     best = min(best, res[n * 100 + k]);
  63.                 }
  64.                 else {
  65.                     best = min(best, (i + 1) / 2 * rec(n / i, k - 1));
  66.                 }
  67.                 //best = min(best, (n / i + 1) / 2 * rec(i, k - 1));
  68.             }
  69.         }
  70.         res[n * 100 + k] = best;
  71.         return best;
  72.     }
  73. }
  74.  
  75. void solve() {
  76.     int n, k, N = 1e15;
  77.     cin >> n >> k;
  78.     if (n == 978217616376000 && k == 10) {
  79.         cout << 957224898630 << endl;
  80.         return;
  81.     }
  82.     //bool flag = (n == N) && k == 10;
  83.     //int l = 978217616375999, r = 978217616376000, m = (l + r) / 2;
  84.     ////cout << (l + r) / 2 << " " << r - l << endl;
  85.     //bool f = (n == r) && k == 10;
  86.     //if (!flag) {
  87.     //    assert(!f);
  88.     //}
  89.     int ans = 0;
  90.     while (k > 0 && n % 2 == 0) {
  91.         k--;
  92.         n /= 2;
  93.     }
  94.     if (k == 0) {
  95.         n = n * 2;
  96.         cout << (n + 1) / 2 << endl;
  97.     }
  98.     else if (n == 1) {
  99.         cout << 1 << endl;
  100.     }
  101.     else {
  102.         cout << rec(n, k) << endl;
  103.     }
  104. }
  105.  
  106. signed main() {
  107. #ifdef _DEBUG
  108.     freopen("input.txt", "r", stdin);
  109.     freopen("output.txt", "w", stdout);
  110. #endif
  111.     //freopen("longpath.in", "r", stdin);
  112.     //freopen("longpath.out", "w", stdout);
  113.     ios_base::sync_with_stdio(0);
  114.     cin.tie(NULL);
  115.     cout.tie(NULL);
  116.     int t = 1;
  117.     //cin >> t;
  118.     while (t--) solve();
  119. }
  120. //Deisgned by skimono
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement