#include <iostream>
#include <math.h>
typedef long long int i64;
int jacobi(i64 k, i64 n)
{
int res = 1;
i64 kmn;
if( k < 0 ) { k = -k; if( n & 2 ) { res = -res; } }
while( (kmn = k % n) != 0 ) {
k = n; n = kmn;
while( !(n & 3) ) { n >>= 2; }
if( !(n & 1) ) {
n >>= 1;
if( (k ^ (k >> 1)) & 2 ) { res = -res; }
}
if( (n & k & 2) ) { res = -res; }
}
return ( n == 1 ? res : 0 );
}
i64 modprod(i64 a, i64 b, i64 mod) // mod < 2^43
{
if( !(a & 0xffffffff80000000) && !(b & 0xffffffff80000000) ) {
return (a * b) % mod;
}
i64 a2 = a / (1LL << 34);
i64 b2 = b / (1LL << 34);
i64 a1 = (a / (1LL << 17)) % (1LL << 17);
i64 b1 = (b / (1LL << 17)) % (1LL << 17);
i64 a0 = a % (1LL << 17);
i64 b0 = b % (1LL << 17);
i64 rem = (a2 * b2) % mod;
rem = ((rem << 17) + a2 * b1 + a1 * b2) % mod;
rem = ((rem << 17) + a2 * b0 + a1 * b1 + a0 * b2) % mod;
rem = ((rem << 17) + a1 * b0 + a0 * b1) % mod;
rem = ((rem << 17) + a0 * b0) % mod;
return rem;
}
i64 modpow(i64 base, i64 power, i64 mod)
{
i64 result = 1;
while( power > 0 ) {
if( power & 1 ) { result = modprod(result, base, mod); }
base = modprod(base, base, mod);
power >>= 1;
}
return result;
}
bool is_prime(i64 n)
{
// Miller-Rabin (base 2)
{ i64 d = (n - 1) >> 1;
int s = 1;
while( (d & 1) == 0 ) { d >>= 1; s ++; }
i64 y = modpow(2, d, n);
if( y != 1 ) {
for(int t = s; y != n - 1 ;y = modprod(y, y, n)) {
if( -- t == 0 ) { return false; }
}
}
}
// square number check
{ i64 s = (i64)(sqrt((double)n) + .5);
if( s * s == n ) { return false; }
}
// Lucas
{ int d = 5, s = 1;
while( jacobi(d * s, n) >= 0 ) { d += 2; s = -s; }
d *= s;
int p = 1, q = (1 - d) / 4;
i64 k = n + 1, u = 1, v = p, m = 1, qm = q;
for(int b = 32; b > 0 ;b >>= 1) { if( k >= (m << b) ) { m <<= b; } }
while( (m >>= 1) > 0 ) {
u = modprod(u, v, n);
v = (modprod(v, v, n) - qm * 2) % n;
qm = modprod(qm, qm, n);
if( (k & m) ) {
i64 u2 = modprod(p, u, n * 2) + v;
i64 v2 = modprod(d, u, n * 2) + modprod(p, v, n * 2);
u = ( (u2 & 1) ? ((u2 + n) / 2) % n : (u2 / 2) % n );
v = ( (v2 & 1) ? ((v2 + n) / 2) % n : (v2 / 2) % n );
qm = modprod(qm, q, n);
}
}
if( u != 0 ) { return false; }
}
return true;
}
int main()
{
int found = 0, s = 0, d = 4;
for(i64 p = 5; p < (1LL << 43) ;p += (d = 6 - d)) {
if( is_prime(p) ) {
if( (s += d - 3) == 0 ) { std::cout << p << std::endl; }
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgp0eXBlZGVmIGxvbmcgbG9uZyBpbnQgaTY0OwoKaW50IGphY29iaShpNjQgaywgaTY0IG4pCnsKCWludAlyZXMgPSAxOwoJaTY0CWttbjsKCglpZiggayA8IDAgKSB7IGsgPSAtazsgaWYoIG4gJiAyICkgeyByZXMgPSAtcmVzOyB9IH0KCQoJd2hpbGUoIChrbW4gPSBrICUgbikgIT0gMCApIHsKCQlrID0gbjsgbiA9IGttbjsKCQl3aGlsZSggIShuICYgMykgKSB7IG4gPj49IDI7IH0KCQlpZiggIShuICYgMSkgKSB7CgkJCW4gPj49IDE7CgkJCWlmKCAoayBeIChrID4+IDEpKSAmIDIgKSB7IHJlcyA9IC1yZXM7IH0KCQl9CgkJaWYoIChuICYgayAmIDIpICkgeyByZXMgPSAtcmVzOyB9Cgl9CglyZXR1cm4gKCBuID09IDEgPyByZXMgOiAwICk7Cn0KCmk2NCBtb2Rwcm9kKGk2NCBhLCBpNjQgYiwgaTY0IG1vZCkJLy8gbW9kIDwgMl40Mwp7CglpZiggIShhICYgMHhmZmZmZmZmZjgwMDAwMDAwKSAmJiAhKGIgJiAweGZmZmZmZmZmODAwMDAwMDApICkgewoJCXJldHVybiAoYSAqIGIpICUgbW9kOwoJfQoKCWk2NCBhMiA9ICBhIC8gKDFMTCA8PCAzNCk7CglpNjQgYjIgPSAgYiAvICgxTEwgPDwgMzQpOwoJaTY0IGExID0gKGEgLyAoMUxMIDw8IDE3KSkgJSAoMUxMIDw8IDE3KTsKCWk2NCBiMSA9IChiIC8gKDFMTCA8PCAxNykpICUgKDFMTCA8PCAxNyk7CglpNjQgYTAgPSAgYSAlICgxTEwgPDwgMTcpOwoJaTY0IGIwID0gIGIgJSAoMUxMIDw8IDE3KTsKCglpNjQgcmVtID0JCQkoYTIgKiBiMikgJSBtb2Q7CglyZW0gPSAoKHJlbSA8PCAxNykgKyBhMiAqIGIxICsgYTEgKiBiMikgJSBtb2Q7CglyZW0gPSAoKHJlbSA8PCAxNykgKyBhMiAqIGIwICsgYTEgKiBiMSArIGEwICogYjIpICUgbW9kOwoJcmVtID0gKChyZW0gPDwgMTcpCQkJICsgYTEgKiBiMCArIGEwICogYjEpICUgbW9kOwoJcmVtID0gKChyZW0gPDwgMTcpCQkJCQkgICArIGEwICogYjApICUgbW9kOwoKCXJldHVybiByZW07Cn0KCmk2NCBtb2Rwb3coaTY0IGJhc2UsIGk2NCBwb3dlciwgaTY0IG1vZCkKewoJaTY0IHJlc3VsdCA9IDE7Cgl3aGlsZSggcG93ZXIgPiAwICkgewoJCWlmKCBwb3dlciAmIDEgKSB7IHJlc3VsdCA9IG1vZHByb2QocmVzdWx0LCBiYXNlLCBtb2QpOyB9CgkJYmFzZSA9IG1vZHByb2QoYmFzZSwgYmFzZSwgbW9kKTsKCQlwb3dlciA+Pj0gMTsKCX0KCXJldHVybiByZXN1bHQ7Cn0KCmJvb2wgaXNfcHJpbWUoaTY0IG4pCnsKCS8vIE1pbGxlci1SYWJpbiAoYmFzZSAyKQoJewlpNjQgZCA9IChuIC0gMSkgPj4gMTsKCQlpbnQgcyA9IDE7CgkJd2hpbGUoIChkICYgMSkgPT0gMCApIHsgZCA+Pj0gMTsgcyArKzsgfQoJCWk2NCB5ID0gbW9kcG93KDIsIGQsIG4pOwoJCWlmKCB5ICE9IDEgKSB7CgkJCWZvcihpbnQgdCA9IHM7IHkgIT0gbiAtIDEgO3kgPSBtb2Rwcm9kKHksIHksIG4pKSB7CgkJCQlpZiggLS0gdCA9PSAwICkgeyByZXR1cm4gZmFsc2U7IH0KCQkJfQoJCX0KCX0KCgkvLyBzcXVhcmUgbnVtYmVyIGNoZWNrCgl7CWk2NCBzID0gKGk2NCkoc3FydCgoZG91YmxlKW4pICsgLjUpOwoJCWlmKCBzICogcyA9PSBuICkgeyByZXR1cm4gZmFsc2U7IH0KCX0KCgkvLyBMdWNhcwoJewlpbnQgZCA9IDUsIHMgPSAxOwoJCXdoaWxlKCBqYWNvYmkoZCAqIHMsIG4pID49IDAgKSB7IGQgKz0gMjsgcyA9IC1zOyB9CgkJZCAqPSBzOwoJCWludCBwID0gMSwgcSA9ICgxIC0gZCkgLyA0OwoJCWk2NCBrID0gbiArIDEsIHUgPSAxLCB2ID0gcCwgbSA9IDEsIHFtID0gcTsKCQkKCQlmb3IoaW50IGIgPSAzMjsgYiA+IDAgO2IgPj49IDEpIHsgaWYoIGsgPj0gKG0gPDwgYikgKSB7IG0gPDw9IGI7IH0gfQoKCQl3aGlsZSggKG0gPj49IDEpID4gMCApIHsKCQkJdSA9IG1vZHByb2QodSwgdiwgbik7CgkJCXYgPSAobW9kcHJvZCh2LCB2LCBuKSAtIHFtICogMikgJSBuOwoJCQlxbSA9IG1vZHByb2QocW0sIHFtLCBuKTsKCgkJCWlmKCAoayAmIG0pICkgewoJCQkJaTY0IHUyID0gbW9kcHJvZChwLCB1LCBuICogMikgKyB2OwoJCQkJaTY0IHYyID0gbW9kcHJvZChkLCB1LCBuICogMikgKyBtb2Rwcm9kKHAsIHYsIG4gKiAyKTsKCQkJCXUgPSAoICh1MiAmIDEpID8gKCh1MiArIG4pIC8gMikgJSBuIDogKHUyIC8gMikgJSBuICk7CgkJCQl2ID0gKCAodjIgJiAxKSA/ICgodjIgKyBuKSAvIDIpICUgbiA6ICh2MiAvIDIpICUgbiApOwoJCQkJcW0gPSBtb2Rwcm9kKHFtLCBxLCBuKTsKCQkJfQoJCX0KCQlpZiggdSAhPSAwICkgeyByZXR1cm4gZmFsc2U7IH0KCX0KCQoJcmV0dXJuIHRydWU7Cn0KCmludCBtYWluKCkKewoJaW50IGZvdW5kID0gMCwgcyA9IDAsIGQgPSA0OwoJZm9yKGk2NCBwID0gNTsgcCA8ICgxTEwgPDwgNDMpIDtwICs9IChkID0gNiAtIGQpKSB7CgkJaWYoIGlzX3ByaW1lKHApICkgewoJCQlpZiggKHMgKz0gZCAtIDMpID09IDAgKSB7IHN0ZDo6Y291dCA8PCBwIDw8IHN0ZDo6ZW5kbDsgfQoJCX0KCX0KCXJldHVybiAwOwp9Cg==