Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdbool.h>
- #include <stdint.h>
- #include <inttypes.h>
- #include <limits.h>
- const long long lim = (USHRT_MAX * 1LL + 1LL) * (UINT_MAX * 1LL + 1LL);
- const long long st = UINT_MAX * 1LL + 1LL;
- long long f(long long x)
- {
- long long l, r;
- l = 0;
- r = st / 2;
- while(r - l > 1LL)
- {
- long long m = (l + r) >> 1;
- if(m * m > x)
- {
- r = m;
- }
- else
- {
- if(m * m < x)
- {
- l = m;
- }
- else
- {
- r = m;
- break;
- }
- }
- }
- if(l * l > x)
- {
- r = l;
- }
- return (r - 1) * x;
- }
- int main(void)
- {
- long long x, p;
- scanf("%lli", &x);
- long long ans = -1;
- for(p = x; p < lim; p += st)
- {
- long long l = 0;
- long long r = st - 1LL;
- while(r - l > 1LL)
- {
- long long m = (l + r) >> 1LL;
- long long a = f(m);
- if(a > p)
- {
- r = m;
- }
- else
- {
- if(a < p)
- {
- l = m;
- }
- else
- {
- r = m;
- break;
- }
- }
- }
- if(p == f(l))
- {
- ans = l;
- break;
- }
- if(p == f(r))
- {
- ans = r;
- break;
- }
- }
- printf("%lli\n", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement