Advertisement
welleyth

BigInt Updated

Jul 11th, 2022
871
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.20 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6.  
  7. #define int long long
  8. #define mp make_pair
  9. #define pb push_back
  10.  
  11. #pragma GCC optimize("Ofast")
  12. #pragma GCC optimize("unroll-loops")
  13. #pragma GCC target("avx2")
  14.  
  15. constexpr int INF = (int)2e18;
  16. constexpr int N = (int)4e5 + 111;
  17. constexpr int md = (int)1e9+7;
  18. constexpr int mdPower = (int)1e9+7 - 1;
  19. constexpr double eps = 1e-7;
  20.  
  21. typedef __int128 _uint;
  22. typedef long long ll;
  23.  
  24. mt19937_64 rnd(time(nullptr));
  25.  
  26. void add(int& a,int b){
  27.     a += b; if(a >= md) a -= md;
  28. }
  29. void sub(int& a,int b){
  30.     a -= b; while(a < 0) a += md;
  31. }
  32. void add(__int128& a,int b){
  33.     a += b;
  34. }
  35. void sub(__int128& a,int b){
  36.     a -= b;
  37. }
  38.  
  39. int bpow(int a,int b){
  40.     if(b == 0)
  41.         return 1;
  42.     if(b % 2 == 0){
  43.         int t = bpow(a,b>>1);
  44.         return 1ll*t*t%md;
  45.     }
  46.     return 1ll * a*bpow(a,b-1) % md;
  47. }
  48.  
  49. int inv(int a){
  50.     return bpow(a,md-2);
  51. }
  52.  
  53. //int fac[N],invfac[N];
  54. //
  55. //void init(){
  56. //    fac[0] = 1;
  57. //    for(int i = 1; i < N; i++){
  58. //        fac[i] = (fac[i-1] * i) % md;
  59. //    }
  60. //    invfac[N-1] = inv(fac[N-1]);
  61. //    for(int i = N-2; i >= 0; i--){
  62. //        invfac[i] = (invfac[i+1] * (i+1))%md;
  63. //    }
  64. //    return;
  65. //}
  66. //
  67. //int C(int n,int k){
  68. //    if(k > n)
  69. //        return 0;
  70. //    return fac[n] * invfac[k] % md * invfac[n-k] % md;
  71. //}
  72. //
  73. //int A(int n,int k){
  74. //    if(k > n)
  75. //        return 0;
  76. //    return fac[n] * invfac[n-k] % md;
  77. //
  78.  
  79. struct BigInt{
  80.     vector<int> v;
  81.     BigInt(){}
  82.     BigInt(string s){
  83.         reverse(s.begin(),s.end());
  84.         for(int i = 0; i < s.size(); i++)
  85.             v.pb(s[i] - '0');
  86.         if(v.empty())
  87.             v.pb(0);
  88.     }
  89.     BigInt(int x){
  90.         string s = to_string(x);
  91.         reverse(s.begin(),s.end());
  92.         for(int i = 0; i < s.size(); i++)
  93.             v.pb(s[i] - '0');
  94.         if(v.empty())
  95.             v.pb(0);
  96.     }
  97.     bool operator <=(BigInt a){
  98.         string s1 = "";
  99.         for(auto& x : v)
  100.             s1 += x + '0';
  101.         while(!s1.empty() && s1.back() == '0')
  102.             s1.pop_back();
  103.         if(s1.empty())
  104.             s1 = "0";
  105.         reverse(s1.begin(),s1.end());
  106.         string s2 = "";
  107.         for(auto& x : a.v)
  108.             s2 += x + '0';
  109.         while(!s2.empty() && s2.back() == '0')
  110.             s2.pop_back();
  111.         if(s2.empty())
  112.             s2 = "0";
  113.         reverse(s2.begin(),s2.end());
  114.         if(s1.size() < s2.size())
  115.             return true;
  116.         if(s1.size() > s2.size())
  117.             return false;
  118.         for(int i = 0; i < s1.size(); i++){
  119.             if(s1[i] > s2[i])
  120.                 return false;
  121.             if(s1[i] < s2[i])
  122.                 return true;
  123.         }
  124.         return true;
  125.     }
  126.     bool operator <(BigInt a){
  127.         string s1 = "";
  128.         for(auto& x : v)
  129.             s1 += x + '0';
  130.         while(!s1.empty() && s1.back() == '0')
  131.             s1.pop_back();
  132.         if(s1.empty())
  133.             s1 = "0";
  134.         reverse(s1.begin(),s1.end());
  135.         string s2 = "";
  136.         for(auto& x : a.v)
  137.             s2 += x + '0';
  138.         while(!s2.empty() && s2.back() == '0')
  139.             s2.pop_back();
  140.         if(s2.empty())
  141.             s2 = "0";
  142.         reverse(s2.begin(),s2.end());
  143.         if(s1.size() < s2.size())
  144.             return true;
  145.         if(s1.size() > s2.size())
  146.             return false;
  147.         for(int i = 0; i < s1.size(); i++){
  148.             if(s1[i] > s2[i])
  149.                 return false;
  150.             if(s1[i] < s2[i])
  151.                 return true;
  152.         }
  153.         return false;
  154.     }
  155.     bool operator >(BigInt a){
  156.         string s1 = "";
  157.         for(auto& x : v)
  158.             s1 += x + '0';
  159.         while(!s1.empty() && s1.back() == '0')
  160.             s1.pop_back();
  161.         if(s1.empty())
  162.             s1 = "0";
  163.         reverse(s1.begin(),s1.end());
  164.         string s2 = "";
  165.         for(auto& x : a.v)
  166.             s2 += x + '0';
  167.         while(!s2.empty() && s2.back() == '0')
  168.             s2.pop_back();
  169.         if(s2.empty())
  170.             s2 = "0";
  171.         reverse(s2.begin(),s2.end());
  172.         if(s1.size() < s2.size())
  173.             return false;
  174.         if(s1.size() > s2.size())
  175.             return true;
  176.         for(int i = 0; i < s1.size(); i++){
  177.             if(s1[i] > s2[i])
  178.                 return true;
  179.             if(s1[i] < s2[i])
  180.                 return false;
  181.         }
  182.         return false;
  183.     }
  184.     bool operator !=(BigInt a){
  185.         return a.v != v;
  186.     }
  187.     void print(){
  188.         string s = "";
  189.         for(auto& x : v)
  190.             s += x + '0';
  191.         while(!s.empty() && s.back() == '0')
  192.             s.pop_back();
  193.         if(s.empty())
  194.             s = "0";
  195.         reverse(s.begin(),s.end());
  196.         cout << s;
  197.         return;
  198.     }
  199.     void read(){
  200.         string s;
  201.         cin >> s;
  202.         v.clear();
  203.         reverse(s.begin(),s.end());
  204.         for(int i = 0; i < s.size(); i++)
  205.             v.pb(s[i] - '0');
  206.         if(v.empty())
  207.             v.pb(0);
  208.     }
  209. };
  210.  
  211. void normalize(BigInt& a){
  212.     while(!a.v.empty() && a.v.back() == 0){
  213.         a.v.pop_back();
  214.     }
  215.     if(a.v.empty())
  216.         a.v.pb(0);
  217.     return;
  218. }
  219.  
  220. BigInt operator +(BigInt a,BigInt b){
  221.     BigInt c;
  222.     int r = 0;
  223.     for(int i = 0; i < max(a.v.size(),b.v.size() + 1); i++){
  224.         int v1 = 0, v2 = 0;
  225.         if(i < a.v.size())
  226.             v1 = a.v[i];
  227.         if(i < b.v.size())
  228.             v2 = b.v[i];
  229.         int s = v1 + v2 + r;
  230.         r = s/10;
  231.         c.v.pb(s%10);
  232.     }
  233.     while(!c.v.empty() && c.v.back() == 0)
  234.         c.v.pop_back();
  235.     if(c.v.empty())
  236.         c.v.pb(0);
  237.     return c;
  238. }
  239. BigInt operator -(BigInt a,BigInt b){
  240.     BigInt c;
  241.     int r = 0;
  242.     for(int i = 0; i < max(a.v.size(),b.v.size() + 1); i++){
  243.         int v1 = 0, v2 = 0;
  244.         if(i < a.v.size())
  245.             v1 = a.v[i];
  246.         if(i < b.v.size())
  247.             v2 = b.v[i];
  248.         int s = v1 - v2 + r;
  249.         r = s/10;
  250.         c.v.pb(s%10);
  251.     }
  252.     for(int i = 0; i < c.v.size(); i++){
  253.         if(c.v[i] < 0){
  254.             for(int j = i+1; j < c.v.size(); j++){
  255.                 if(c.v[j] > 0){
  256.                     c.v[j]--;
  257.                     for(int t = j-1; t > i; t--){
  258.                         c.v[t] += 9;
  259.                     }
  260.                     c.v[i] += 10;
  261.                     break;
  262.                 }
  263.             }
  264.         }
  265.     }
  266.     while(!c.v.empty() && c.v.back() == 0)
  267.         c.v.pop_back();
  268.     if(c.v.empty())
  269.         c.v.pb(0);
  270.     return c;
  271. }
  272. BigInt operator *(BigInt a,BigInt b){
  273.     BigInt c;
  274.     c.v.resize(a.v.size()+b.v.size()+10,0);
  275.     for(int i = 0; i < a.v.size(); i++){
  276.         for(int j = 0;j < b.v.size(); j++){
  277.             c.v[i+j] += a.v[i] * b.v[j];
  278.         }
  279.     }
  280.     int r = 0;
  281.     for(int i = 0; i < c.v.size(); i++){
  282.         c.v[i] += r;
  283.         r = c.v[i] / 10;
  284.         c.v[i] %= 10;
  285.     }
  286.     while(!c.v.empty() && c.v.back() == 0)
  287.         c.v.pop_back();
  288.     if(c.v.empty())
  289.         c.v.pb(0);
  290.     return c;
  291. }
  292. BigInt pw10[21001];
  293. BigInt operator/(BigInt a,BigInt b){
  294.     if(a < b)
  295.         return BigInt(0);
  296.     BigInt c = BigInt(0);
  297.     c.v.resize(a.v.size(),0);
  298.     for(int i = a.v.size()-1; i >= 0; i--){
  299.         for(int j = 0; j < 11; j++){
  300.             if(c*b + pw10[i] * j * b > a){
  301.                 c.v[i] = max(0ll,j-1);
  302.                 break;
  303.             }
  304.         }
  305.     }
  306.     normalize(c);
  307.     return c;
  308. }
  309. BigInt operator/(BigInt a,int b){
  310.     return a / BigInt(b);
  311. }
  312. BigInt sqrt(BigInt x){
  313.     BigInt l = BigInt(0), r = BigInt("1" + string(x.v.size()/2+1,'0'));
  314.     while((r - l) > BigInt(1)){
  315.         BigInt m = (l+r)/2;
  316.         if(m * m > x)
  317.             r = m;
  318.         else
  319.             l = m;
  320.     }
  321.     return l;
  322. }
  323.  
  324. void init(){
  325.     BigInt a = BigInt(1);
  326.     for(int i = 0; i < 5001; i++){
  327.         pw10[i] = BigInt("1" + string(i,'0'));
  328.     }
  329.     return;
  330. }
  331.  
  332. void solve(){
  333.     init();
  334.  
  335. //    (BigInt(50)/2).print();
  336. //
  337. //    return;
  338.     BigInt P;
  339.     P.read();
  340.     BigInt tmp = sqrt(P);
  341.     int len = tmp.v.size();
  342.  
  343.     for(int m = max(1ll,len-1); m <= len+2; m++){
  344.         BigInt t = BigInt(m+1);
  345.         BigInt u = t * t + 4*P;
  346.         BigInt rt = sqrt(u);
  347. //        cerr << "u = ";
  348. //        u.print();
  349. //        cerr << "\n";
  350. //        cerr << "rt = ";
  351. //        rt.print();
  352. //        cerr << "\n";
  353.         if(rt * rt != u){
  354. //            cerr << "m = " << m << "\n";
  355.             continue;
  356.         }
  357.         rt = rt + 1 - m;
  358.         t = rt / 2;
  359.         if(t * 2 != rt)
  360.             continue;
  361.         normalize(t);
  362.         if(m != t.v.size()){
  363. //            cerr << "t = ";
  364. //            t.print();
  365. //            cerr << "\n";
  366. //            cerr << "v.sz = " << t.v.size() << "\n";
  367.             continue;
  368.         }
  369.         t.print();
  370.         return;
  371.     }
  372.  
  373.     cout << "-1\n";
  374.  
  375.     return;
  376. }
  377.  
  378. signed main(){
  379.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  380.     int tests = 1;
  381. //    cin >> tests;
  382.     for(int test = 1; test <= tests; test++){
  383. //        cerr << "test = " << test << "\n";
  384.         solve();
  385.     }
  386.     return 0;
  387. }
  388. /**
  389. dist = max(abs(x-x1),abs(y-y1))
  390.  
  391. 3 - 2
  392.  
  393. **/
  394.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement