#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) #endif #define x first #define y second #define ir(a, x, b) ((a) <= (x) && (x) <= (b)) #define vec vector #define rep(i, a, b) for (ll i = a; i < (b); ++i) #define all(x) (x).begin(), (x).end() #include "dzilib.h" using ll = long long; long long numberOfDivisors(long long num) { long long total = 1; for (int i = 2; (long long)i * i <= num; i++) { if (num % i == 0) { int e = 0; do { e++; num /= i; } while (num % i == 0); total *= e + 1; } } if (num > 1) { total *= 2; } return total; } mt19937_64 gen; ll add; map<ll, int> mm; ll ask(ll x) { if (!mm.contains(x)) mm[x] = Ask(x+add); // asks.push_back({power, {x, mm[x]}}); return mm[x]; } const int K = 30; bool verify(ll C) { if (C < 0) return false; for (auto [a, b] : mm) { // ask(a) = div(C+a) = mm[a] = b ll twos = 0, x = C+a; while (x % 2 == 0) { x /= 2; twos++; } if (x < ll(1e9)) { if (b % (twos+1) != 0) return false; if (b != numberOfDivisors(x)*(twos+1)) return false; } } return true; } void solve() { ll c = GetC(); ll n = GetN(); add = gen() % 100000; mm.clear(); int base = 0; while (true) { debug("here", base); if (ask(base) % 5 == 0 && ask(base+32) % 5 == 0 && ask(base+64) % 5 == 0) { break; } base++; } debug(base); ll val = 16; rep (power, 4, K) { // invariant: 2^power | C+base // debug(power, val); // assert((1000+add+base) % (1ll << power) == 0); rep (k, 0, 1000) { if (ask(base + k*val) % (power+1) != 0) { // 2^(power+1) | base + k*val base = base + (k%2)*val; break; } } val *= 2; } int x = 1; debug(add, base); while (true) { ll y = (1ll << K)*x-base; debug("here", x, y); if (verify(y)) { Answer(y-add); // TODO return; } x++; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = GetT(); while (t--) solve(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) #endif #define x first #define y second #define ir(a, x, b) ((a) <= (x) && (x) <= (b)) #define vec vector #define rep(i, a, b) for (ll i = a; i < (b); ++i) #define all(x) (x).begin(), (x).end() #include "dzilib.h" using ll = long long; long long numberOfDivisors(long long num) { long long total = 1; for (int i = 2; (long long)i * i <= num; i++) { if (num % i == 0) { int e = 0; do { e++; num /= i; } while (num % i == 0); total *= e + 1; } } if (num > 1) { total *= 2; } return total; } mt19937_64 gen; ll add; map<ll, int> mm; ll ask(ll x) { if (!mm.contains(x)) mm[x] = Ask(x+add); // asks.push_back({power, {x, mm[x]}}); return mm[x]; } const int K = 30; bool verify(ll C) { if (C < 0) return false; for (auto [a, b] : mm) { // ask(a) = div(C+a) = mm[a] = b ll twos = 0, x = C+a; while (x % 2 == 0) { x /= 2; twos++; } if (x < ll(1e9)) { if (b % (twos+1) != 0) return false; if (b != numberOfDivisors(x)*(twos+1)) return false; } } return true; } void solve() { ll c = GetC(); ll n = GetN(); add = gen() % 100000; mm.clear(); int base = 0; while (true) { debug("here", base); if (ask(base) % 5 == 0 && ask(base+32) % 5 == 0 && ask(base+64) % 5 == 0) { break; } base++; } debug(base); ll val = 16; rep (power, 4, K) { // invariant: 2^power | C+base // debug(power, val); // assert((1000+add+base) % (1ll << power) == 0); rep (k, 0, 1000) { if (ask(base + k*val) % (power+1) != 0) { // 2^(power+1) | base + k*val base = base + (k%2)*val; break; } } val *= 2; } int x = 1; debug(add, base); while (true) { ll y = (1ll << K)*x-base; debug("here", x, y); if (verify(y)) { Answer(y-add); // TODO return; } x++; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = GetT(); while (t--) solve(); return 0; } |