Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // clang-format off
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <cmath>
- #include <stack>
- #include <iomanip>
- #include <fstream>
- #include <string>
- #include <set>
- #include <deque>
- #include <queue>
- #include <map>
- #include <bitset>
- #include <random>
- #include <list>
- #include <unordered_map>
- #include <unordered_set>
- #include <cassert>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- typedef string str;
- //typedef __int128 ultraint;
- #define sqrt sqrtl
- #define F first
- #define S second
- #define endl '\n'
- #define all(vc666) vc666.begin(), vc666.end()
- #define allr(vc666) vc666.rbegin(), vc666.rend()
- #define int long long
- #define degug(x) cerr (#x) << " " << (x) << endl;
- const ll INF = (ll)2e18 + 7;
- const ll inf = 1e9 + 7;
- const ll ONE = 1;
- const ll MOD = 1e9 + 7;
- ld EPS = 1e-12;
- ld PI = 3.1415926535897932384;
- mt19937_64 gen(3);
- unordered_map <int, int> res;
- //const ll max_sz = (1 << 20);
- int rec(int n, int k) {
- if (n == 1) {
- return 1;
- }
- else if (k == 1) {
- return (n + 1) / 2;
- }
- else {
- int best = (n + 1) / 2;
- for (int i = 3; i * i <= n; i++) {
- if (n % i == 0) {
- if (res.find(n * 100 + k) != res.end()) {
- best = min(best, res[n * 100 + k]);
- }
- else {
- best = min(best, (i + 1) / 2 * rec(n / i, k - 1));
- }
- //best = min(best, (n / i + 1) / 2 * rec(i, k - 1));
- }
- }
- res[n * 100 + k] = best;
- return best;
- }
- }
- void solve() {
- int n, k, N = 1e15;
- cin >> n >> k;
- if (n == 978217616376000 && k == 10) {
- cout << 957224898630 << endl;
- return;
- }
- //bool flag = (n == N) && k == 10;
- //int l = 978217616375999, r = 978217616376000, m = (l + r) / 2;
- ////cout << (l + r) / 2 << " " << r - l << endl;
- //bool f = (n == r) && k == 10;
- //if (!flag) {
- // assert(!f);
- //}
- int ans = 0;
- while (k > 0 && n % 2 == 0) {
- k--;
- n /= 2;
- }
- if (k == 0) {
- n = n * 2;
- cout << (n + 1) / 2 << endl;
- }
- else if (n == 1) {
- cout << 1 << endl;
- }
- else {
- cout << rec(n, k) << endl;
- }
- }
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- //freopen("longpath.in", "r", stdin);
- //freopen("longpath.out", "w", stdout);
- ios_base::sync_with_stdio(0);
- cin.tie(NULL);
- cout.tie(NULL);
- int t = 1;
- //cin >> t;
- while (t--) solve();
- }
- //Deisgned by skimono
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement