Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- using namespace std;
- #define int long long
- #define mp make_pair
- #define pb push_back
- #pragma GCC optimize("Ofast")
- #pragma GCC optimize("unroll-loops")
- #pragma GCC target("avx2")
- constexpr int INF = (int)2e18;
- constexpr int N = (int)4e5 + 111;
- constexpr int md = (int)1e9+7;
- constexpr int mdPower = (int)1e9+7 - 1;
- constexpr double eps = 1e-7;
- typedef __int128 _uint;
- typedef long long ll;
- mt19937_64 rnd(time(nullptr));
- void add(int& a,int b){
- a += b; if(a >= md) a -= md;
- }
- void sub(int& a,int b){
- a -= b; while(a < 0) a += md;
- }
- void add(__int128& a,int b){
- a += b;
- }
- void sub(__int128& a,int b){
- a -= b;
- }
- int bpow(int a,int b){
- if(b == 0)
- return 1;
- if(b % 2 == 0){
- int t = bpow(a,b>>1);
- return 1ll*t*t%md;
- }
- return 1ll * a*bpow(a,b-1) % md;
- }
- int inv(int a){
- return bpow(a,md-2);
- }
- //int fac[N],invfac[N];
- //
- //void init(){
- // fac[0] = 1;
- // for(int i = 1; i < N; i++){
- // fac[i] = (fac[i-1] * i) % md;
- // }
- // invfac[N-1] = inv(fac[N-1]);
- // for(int i = N-2; i >= 0; i--){
- // invfac[i] = (invfac[i+1] * (i+1))%md;
- // }
- // return;
- //}
- //
- //int C(int n,int k){
- // if(k > n)
- // return 0;
- // return fac[n] * invfac[k] % md * invfac[n-k] % md;
- //}
- //
- //int A(int n,int k){
- // if(k > n)
- // return 0;
- // return fac[n] * invfac[n-k] % md;
- //
- struct BigInt{
- vector<int> v;
- BigInt(){}
- BigInt(string s){
- reverse(s.begin(),s.end());
- for(int i = 0; i < s.size(); i++)
- v.pb(s[i] - '0');
- if(v.empty())
- v.pb(0);
- }
- BigInt(int x){
- string s = to_string(x);
- reverse(s.begin(),s.end());
- for(int i = 0; i < s.size(); i++)
- v.pb(s[i] - '0');
- if(v.empty())
- v.pb(0);
- }
- bool operator <=(BigInt a){
- string s1 = "";
- for(auto& x : v)
- s1 += x + '0';
- while(!s1.empty() && s1.back() == '0')
- s1.pop_back();
- if(s1.empty())
- s1 = "0";
- reverse(s1.begin(),s1.end());
- string s2 = "";
- for(auto& x : a.v)
- s2 += x + '0';
- while(!s2.empty() && s2.back() == '0')
- s2.pop_back();
- if(s2.empty())
- s2 = "0";
- reverse(s2.begin(),s2.end());
- if(s1.size() < s2.size())
- return true;
- if(s1.size() > s2.size())
- return false;
- for(int i = 0; i < s1.size(); i++){
- if(s1[i] > s2[i])
- return false;
- if(s1[i] < s2[i])
- return true;
- }
- return true;
- }
- bool operator <(BigInt a){
- string s1 = "";
- for(auto& x : v)
- s1 += x + '0';
- while(!s1.empty() && s1.back() == '0')
- s1.pop_back();
- if(s1.empty())
- s1 = "0";
- reverse(s1.begin(),s1.end());
- string s2 = "";
- for(auto& x : a.v)
- s2 += x + '0';
- while(!s2.empty() && s2.back() == '0')
- s2.pop_back();
- if(s2.empty())
- s2 = "0";
- reverse(s2.begin(),s2.end());
- if(s1.size() < s2.size())
- return true;
- if(s1.size() > s2.size())
- return false;
- for(int i = 0; i < s1.size(); i++){
- if(s1[i] > s2[i])
- return false;
- if(s1[i] < s2[i])
- return true;
- }
- return false;
- }
- bool operator >(BigInt a){
- string s1 = "";
- for(auto& x : v)
- s1 += x + '0';
- while(!s1.empty() && s1.back() == '0')
- s1.pop_back();
- if(s1.empty())
- s1 = "0";
- reverse(s1.begin(),s1.end());
- string s2 = "";
- for(auto& x : a.v)
- s2 += x + '0';
- while(!s2.empty() && s2.back() == '0')
- s2.pop_back();
- if(s2.empty())
- s2 = "0";
- reverse(s2.begin(),s2.end());
- if(s1.size() < s2.size())
- return false;
- if(s1.size() > s2.size())
- return true;
- for(int i = 0; i < s1.size(); i++){
- if(s1[i] > s2[i])
- return true;
- if(s1[i] < s2[i])
- return false;
- }
- return false;
- }
- bool operator !=(BigInt a){
- return a.v != v;
- }
- void print(){
- string s = "";
- for(auto& x : v)
- s += x + '0';
- while(!s.empty() && s.back() == '0')
- s.pop_back();
- if(s.empty())
- s = "0";
- reverse(s.begin(),s.end());
- cout << s;
- return;
- }
- void read(){
- string s;
- cin >> s;
- v.clear();
- reverse(s.begin(),s.end());
- for(int i = 0; i < s.size(); i++)
- v.pb(s[i] - '0');
- if(v.empty())
- v.pb(0);
- }
- };
- void normalize(BigInt& a){
- while(!a.v.empty() && a.v.back() == 0){
- a.v.pop_back();
- }
- if(a.v.empty())
- a.v.pb(0);
- return;
- }
- BigInt operator +(BigInt a,BigInt b){
- BigInt c;
- int r = 0;
- for(int i = 0; i < max(a.v.size(),b.v.size() + 1); i++){
- int v1 = 0, v2 = 0;
- if(i < a.v.size())
- v1 = a.v[i];
- if(i < b.v.size())
- v2 = b.v[i];
- int s = v1 + v2 + r;
- r = s/10;
- c.v.pb(s%10);
- }
- while(!c.v.empty() && c.v.back() == 0)
- c.v.pop_back();
- if(c.v.empty())
- c.v.pb(0);
- return c;
- }
- BigInt operator -(BigInt a,BigInt b){
- BigInt c;
- int r = 0;
- for(int i = 0; i < max(a.v.size(),b.v.size() + 1); i++){
- int v1 = 0, v2 = 0;
- if(i < a.v.size())
- v1 = a.v[i];
- if(i < b.v.size())
- v2 = b.v[i];
- int s = v1 - v2 + r;
- r = s/10;
- c.v.pb(s%10);
- }
- for(int i = 0; i < c.v.size(); i++){
- if(c.v[i] < 0){
- for(int j = i+1; j < c.v.size(); j++){
- if(c.v[j] > 0){
- c.v[j]--;
- for(int t = j-1; t > i; t--){
- c.v[t] += 9;
- }
- c.v[i] += 10;
- break;
- }
- }
- }
- }
- while(!c.v.empty() && c.v.back() == 0)
- c.v.pop_back();
- if(c.v.empty())
- c.v.pb(0);
- return c;
- }
- BigInt operator *(BigInt a,BigInt b){
- BigInt c;
- c.v.resize(a.v.size()+b.v.size()+10,0);
- for(int i = 0; i < a.v.size(); i++){
- for(int j = 0;j < b.v.size(); j++){
- c.v[i+j] += a.v[i] * b.v[j];
- }
- }
- int r = 0;
- for(int i = 0; i < c.v.size(); i++){
- c.v[i] += r;
- r = c.v[i] / 10;
- c.v[i] %= 10;
- }
- while(!c.v.empty() && c.v.back() == 0)
- c.v.pop_back();
- if(c.v.empty())
- c.v.pb(0);
- return c;
- }
- BigInt pw10[21001];
- BigInt operator/(BigInt a,BigInt b){
- if(a < b)
- return BigInt(0);
- BigInt c = BigInt(0);
- c.v.resize(a.v.size(),0);
- for(int i = a.v.size()-1; i >= 0; i--){
- for(int j = 0; j < 11; j++){
- if(c*b + pw10[i] * j * b > a){
- c.v[i] = max(0ll,j-1);
- break;
- }
- }
- }
- normalize(c);
- return c;
- }
- BigInt operator/(BigInt a,int b){
- return a / BigInt(b);
- }
- BigInt sqrt(BigInt x){
- BigInt l = BigInt(0), r = BigInt("1" + string(x.v.size()/2+1,'0'));
- while((r - l) > BigInt(1)){
- BigInt m = (l+r)/2;
- if(m * m > x)
- r = m;
- else
- l = m;
- }
- return l;
- }
- void init(){
- BigInt a = BigInt(1);
- for(int i = 0; i < 5001; i++){
- pw10[i] = BigInt("1" + string(i,'0'));
- }
- return;
- }
- void solve(){
- init();
- // (BigInt(50)/2).print();
- //
- // return;
- BigInt P;
- P.read();
- BigInt tmp = sqrt(P);
- int len = tmp.v.size();
- for(int m = max(1ll,len-1); m <= len+2; m++){
- BigInt t = BigInt(m+1);
- BigInt u = t * t + 4*P;
- BigInt rt = sqrt(u);
- // cerr << "u = ";
- // u.print();
- // cerr << "\n";
- // cerr << "rt = ";
- // rt.print();
- // cerr << "\n";
- if(rt * rt != u){
- // cerr << "m = " << m << "\n";
- continue;
- }
- rt = rt + 1 - m;
- t = rt / 2;
- if(t * 2 != rt)
- continue;
- normalize(t);
- if(m != t.v.size()){
- // cerr << "t = ";
- // t.print();
- // cerr << "\n";
- // cerr << "v.sz = " << t.v.size() << "\n";
- continue;
- }
- t.print();
- return;
- }
- cout << "-1\n";
- return;
- }
- signed main(){
- ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
- int tests = 1;
- // cin >> tests;
- for(int test = 1; test <= tests; test++){
- // cerr << "test = " << test << "\n";
- solve();
- }
- return 0;
- }
- /**
- dist = max(abs(x-x1),abs(y-y1))
- 3 - 2
- **/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement