#include <bits/stdc++.h>
using namespace std;
#define FR FermatRepresent
namespace FermatRepresent {
template<class num_t>
inline num_t mult(num_t a, num_t b, num_t p) {
num_t q = (num_t) ((long double) a * b / p);
num_t r = a * b - q * p;
while (r < 0) r += p;
while (r >= p) r -= p;
return r;
}
template<class num_t>
inline num_t fpow(num_t n, num_t k, num_t p) {
num_t r = 1;
for (; k; k >>= 1) {
if (k & 1) r = mult(r, n, p);
n = mult(n, n, p);
}
return r;
}
template<class num_t>
inline num_t isqrt(num_t k) {
num_t r = sqrt(k) + 1;
while (r * r > k) r--;
return r;
}
long long func(long long p) {
srand(2311);
while (1) {
long long u = (long long) rand() * rand() % p;
if (fpow(u, (p - 1) / 2, p) == p - 1) {
long long res = fpow(u, (p - 1) / 4, p);
return max(res, p - res);
}
}
}
pair<int, int> calc(long long p) {
long long a = p, b = func(p);
long long ip = isqrt(p);
while (b > ip) {
a %= b;
swap(a, b);
}
return make_pair(b, isqrt(p - b * b));
}
}
int main() {
pair<int, int> res = FR::calc(613);
cerr << res.first << " " << res.second << "\n";
cerr << res.first * res.first + res.second * res.second << "\n";
cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIEZSIEZlcm1hdFJlcHJlc2VudApuYW1lc3BhY2UgRmVybWF0UmVwcmVzZW50IHsKICAgIHRlbXBsYXRlPGNsYXNzIG51bV90PgogICAgaW5saW5lIG51bV90IG11bHQobnVtX3QgYSwgbnVtX3QgYiwgbnVtX3QgcCkgewogICAgICAgIG51bV90IHEgPSAobnVtX3QpICgobG9uZyBkb3VibGUpIGEgKiBiIC8gcCk7CiAgICAgICAgbnVtX3QgciA9IGEgKiBiIC0gcSAqIHA7CiAgICAgICAgd2hpbGUgKHIgPCAwKSByICs9IHA7CiAgICAgICAgd2hpbGUgKHIgPj0gcCkgciAtPSBwOwogICAgICAgIHJldHVybiByOwogICAgfQogICAgdGVtcGxhdGU8Y2xhc3MgbnVtX3Q+CiAgICBpbmxpbmUgbnVtX3QgZnBvdyhudW1fdCBuLCBudW1fdCBrLCBudW1fdCBwKSB7CiAgICAgICAgbnVtX3QgciA9IDE7CiAgICAgICAgZm9yICg7IGs7IGsgPj49IDEpIHsKICAgICAgICAgICAgaWYgKGsgJiAxKSByID0gbXVsdChyLCBuLCBwKTsKICAgICAgICAgICAgbiA9IG11bHQobiwgbiwgcCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByOwogICAgfQogICAgdGVtcGxhdGU8Y2xhc3MgbnVtX3Q+CiAgICBpbmxpbmUgbnVtX3QgaXNxcnQobnVtX3QgaykgewogICAgICAgIG51bV90IHIgPSBzcXJ0KGspICsgMTsKICAgICAgICB3aGlsZSAociAqIHIgPiBrKSByLS07CiAgICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICBsb25nIGxvbmcgZnVuYyhsb25nIGxvbmcgcCkgewogICAgICAgIHNyYW5kKDIzMTEpOwogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIGxvbmcgbG9uZyB1ID0gKGxvbmcgbG9uZykgcmFuZCgpICogcmFuZCgpICUgcDsKICAgICAgICAgICAgaWYgKGZwb3codSwgKHAgLSAxKSAvIDIsIHApID09IHAgLSAxKSB7CiAgICAgICAgICAgICAgICBsb25nIGxvbmcgcmVzID0gZnBvdyh1LCAocCAtIDEpIC8gNCwgcCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbWF4KHJlcywgcCAtIHJlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBwYWlyPGludCwgaW50PiBjYWxjKGxvbmcgbG9uZyBwKSB7CiAgICAgICAgbG9uZyBsb25nIGEgPSBwLCBiID0gZnVuYyhwKTsKICAgICAgICBsb25nIGxvbmcgaXAgPSBpc3FydChwKTsKICAgICAgICB3aGlsZSAoYiA+IGlwKSB7CiAgICAgICAgICAgIGEgJT0gYjsKICAgICAgICAgICAgc3dhcChhLCBiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1ha2VfcGFpcihiLCBpc3FydChwIC0gYiAqIGIpKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBwYWlyPGludCwgaW50PiByZXMgPSBGUjo6Y2FsYyg2MTMpOwogICAgY2VyciA8PCByZXMuZmlyc3QgPDwgIiAiIDw8IHJlcy5zZWNvbmQgPDwgIlxuIjsKICAgIGNlcnIgPDwgcmVzLmZpcnN0ICogcmVzLmZpcnN0ICsgcmVzLnNlY29uZCAqIHJlcy5zZWNvbmQgPDwgIlxuIjsKICAgIGNlcnIgPDwgIlxuVGltZSBlbGFwc2VkOiAiIDw8IDEwMDAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMgPDwgIm1zXG4iOwogICAgcmV0dXJuIDA7Cn0=