Advertisement
pb_jiang

CF1846E2 TLE

Jul 8th, 2023
707
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include <assert.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #ifndef __DEBUG__
  5. #define dbg(...) 42
  6. #endif
  7. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  8.  
  9. using ll = long long;
  10. using pii = pair<int, int>;
  11. using pll = pair<ll, ll>;
  12. using vl = vector<ll>;
  13. using vi = vector<int>;
  14. using ull = unsigned long long;
  15.  
  16. // constexpr ll p1 = (1ll << 50) - 51, p2 = (1ll << 50) - 117;
  17. constexpr ll p1 = (1ll << 30) - 35, p2 = (1ll << 30) - 41;
  18.  
  19. ll fpow(ll b, ll p, ll m)
  20. {
  21.     ll ret = 1;
  22.     ll cur = b;
  23.     while (p) {
  24.         if (p % 2)
  25.             ret = ret * cur % m;
  26.         cur = cur * cur % m;
  27.         p /= 2;
  28.     }
  29.     return ret;
  30. }
  31.  
  32. int main(int argc, char **argv)
  33. {
  34.     ll t, n;
  35.     cin >> t;
  36.     while (t--) {
  37.         cin >> n;
  38.         bool ok = false;
  39.         for (ll p = 3; p <= 95 && !ok; ++p) {
  40.             int lb = 2, ub = 1e9;
  41.             // auto f = [p](ll k) { return (pow(double(k), double(p)) - 1) / (double) (k - 1); };
  42.             auto f = [p](ll k) { return (powl(k, p) - 1) / (k - 1); };
  43.             while (lb + 1 < ub) {
  44.                 ll mid = (lb + ub) / 2;
  45.                 if (f(mid) <= n)
  46.                     lb = mid;
  47.                 else
  48.                     ub = mid;
  49.             }
  50.             auto fmod = [p](ll k) {
  51.                 return pll{(fpow(k, p, p1) + p1 - 1) % p1 * fpow(k - 1, p1 - 2, p1) % p1,
  52.                            (fpow(k, p, p2) + p2 - 1) % p2 * fpow(k - 1, p2 - 2, p2) % p2};
  53.             };
  54.             if (fmod(lb) == pll{n % p1, n % p2})
  55.                 ok = true;
  56.         }
  57.         /*
  58.         for (ll k = 2; k * k < n; ++k) {
  59.             int lb = 3, ub = 21;
  60.             auto f = [k](ll p) { return (powl(k, p) - 1) / (k - 1); };
  61.             while (lb + 1 < ub) {
  62.                 ll mid = (lb + ub) / 2;
  63.                 if (f(mid) <= n)
  64.                     lb = mid;
  65.                 else
  66.                     ub = mid;
  67.             }
  68.             if (f(lb) == n) {
  69.                 ok = true;
  70.                 break;
  71.             }
  72.         }
  73.         */
  74.         cout << (ok ? "YES" : "NO") << endl;
  75.     }
  76.     return 0;
  77. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement