import java.io.*;
import java.util.*;
public class Main {
long MOD;
class S {
long a, b;
public S(long a, long b, long mod) {
this.a = (a + mod) % mod;
this.b = (b + mod) % mod;
}
S mul(S o, long mod) {
return new S((a * o.a + 5 * b * o.b) % mod, (b * o.a + a * o.b) % mod, mod);
}
S add(S o, long mod) {
return new S((a + o.a)%mod, (b + o.b)%mod, mod);
}
}
public static long inv(long a, long mod) {
a %= mod;
long b = mod;
long p = 1, q = 0;
while (b > 0) {
long c = a / b;
long d;
d = a;
a = b;
b = d % b;
d = p;
p = q;
q = d - c * q;
}
return p < 0 ? p + mod : p;
}
long pow (long a, long n, long MOD) {
long ret = 1;
for (; n > 0; n >>= 1, a = a * a % MOD) {
if (n % 2 == 1) {
ret = ret * a % MOD;
}
}
return ret;
}
void run() {
Scanner sc
= new Scanner
(System.
in); for (MOD = 2; MOD < 1000; ++MOD) {
boolean isPrime = true;
for (long div = 2; div < MOD; ++div) {
isPrime &= MOD % div != 0;
}
if (MOD == 2 || !isPrime) continue;
if (MOD % 5 == 1 || MOD % 5 == 4 || MOD == 5) continue;
S g1 = new S(1, 0, MOD * MOD);
S g2 = new S(1, 0, MOD * MOD);
for (long i = 1; i <= MOD; ++i) {
long i2 = inv(2, MOD * MOD);
g1 = g1.mul(new S(i2-i, -i2, MOD * MOD), MOD * MOD);
//g2 = g2.mul(new S(i2-i, -i2, MOD * MOD), MOD * MOD);
}
System.
out.
println("p=" + MOD
+ " a=" + g1.
a + " a*2%(p*p)=" + (g1.
a*2%(MOD
*MOD
)) + " b=" + g1.
b + " A=" + (g1.
b - 1) / MOD
); }
}
long sqrt5(long MOD) {
for (int i = 2; i < MOD; ++i) {
if (i * i % MOD == 5) return i;
}
throw new AssertionError();
}
new Main().run();
}
static void tr
(Object...
objects) { }
}
aW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEudXRpbC4qOwogCnB1YmxpYyBjbGFzcyBNYWluIHsKIAogICAgbG9uZyBNT0Q7CiAKICAgIGNsYXNzIFMgewogICAgICAgIGxvbmcgYSwgYjsKIAogICAgICAgIHB1YmxpYyBTKGxvbmcgYSwgbG9uZyBiLCBsb25nIG1vZCkgewogICAgICAgICAgICB0aGlzLmEgPSAoYSArIG1vZCkgJSBtb2Q7CiAgICAgICAgICAgIHRoaXMuYiA9IChiICsgbW9kKSAlIG1vZDsKICAgICAgICB9CiAKICAgICAgICBTIG11bChTIG8sIGxvbmcgbW9kKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUygoYSAqIG8uYSArIDUgKiBiICogby5iKSAlIG1vZCwgKGIgKiBvLmEgKyBhICogby5iKSAlIG1vZCwgbW9kKTsKICAgICAgICB9CiAKICAgICAgICBTIGFkZChTIG8sIGxvbmcgbW9kKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUygoYSArIG8uYSklbW9kLCAoYiArIG8uYiklbW9kLCBtb2QpOwogICAgICAgIH0KICAgIH0KIAogICAgcHVibGljIHN0YXRpYyBsb25nIGludihsb25nIGEsIGxvbmcgbW9kKSB7CiAgICAgICAgYSAlPSBtb2Q7CiAgICAgICAgbG9uZyBiID0gbW9kOwogICAgICAgIGxvbmcgcCA9IDEsIHEgPSAwOwogICAgICAgIHdoaWxlIChiID4gMCkgewogICAgICAgICAgICBsb25nIGMgPSBhIC8gYjsKICAgICAgICAgICAgbG9uZyBkOwogICAgICAgICAgICBkID0gYTsKICAgICAgICAgICAgYSA9IGI7CiAgICAgICAgICAgIGIgPSBkICUgYjsKICAgICAgICAgICAgZCA9IHA7CiAgICAgICAgICAgIHAgPSBxOwogICAgICAgICAgICBxID0gZCAtIGMgKiBxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcCA8IDAgPyBwICsgbW9kIDogcDsKICAgIH0KIAogICAgbG9uZyBwb3cgKGxvbmcgYSwgbG9uZyBuLCBsb25nIE1PRCkgewogICAgICAgIGxvbmcgcmV0ID0gMTsKICAgICAgICBmb3IgKDsgbiA+IDA7IG4gPj49IDEsIGEgPSBhICogYSAlIE1PRCkgewogICAgICAgICAgICBpZiAobiAlIDIgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0ID0gcmV0ICogYSAlIE1PRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogCiAgICB2b2lkIHJ1bigpIHsKICAgICAgICBTY2FubmVyIHNjID0gbmV3IFNjYW5uZXIoU3lzdGVtLmluKTsKICAgICAgICBmb3IgKE1PRCA9IDI7IE1PRCA8IDEwMDA7ICsrTU9EKSB7CiAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltZSA9IHRydWU7CiAgICAgICAgICAgIGZvciAobG9uZyBkaXYgPSAyOyBkaXYgPCBNT0Q7ICsrZGl2KSB7CiAgICAgICAgICAgICAgICBpc1ByaW1lICY9IE1PRCAlIGRpdiAhPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChNT0QgPT0gMiB8fCAhaXNQcmltZSkgY29udGludWU7CiAgICAgICAgICAgIGlmIChNT0QgJSA1ID09IDEgfHwgTU9EICUgNSA9PSA0IHx8IE1PRCA9PSA1KSBjb250aW51ZTsKICAgICAgICAgICAgUyBnMSA9IG5ldyBTKDEsIDAsIE1PRCAqIE1PRCk7CiAgICAgICAgICAgIFMgZzIgPSBuZXcgUygxLCAwLCBNT0QgKiBNT0QpOwogICAgICAgICAgICBmb3IgKGxvbmcgIGkgPSAxOyBpIDw9ICBNT0Q7ICsraSkgewogICAgICAgICAgICAgICAgbG9uZyBpMiA9IGludigyLCBNT0QgKiBNT0QpOwogICAgICAgICAgICAgICAgZzEgPSBnMS5tdWwobmV3IFMoaTItaSwgLWkyLCBNT0QgKiBNT0QpLCBNT0QgKiBNT0QpOwogICAgICAgICAgICAgICAgLy9nMiA9IGcyLm11bChuZXcgUyhpMi1pLCAtaTIsIE1PRCAqIE1PRCksIE1PRCAqIE1PRCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwPSIgKyBNT0QgKyAiIGE9IiArIGcxLmEgKyAiIGEqMiUocCpwKT0iICsgKGcxLmEqMiUoTU9EKk1PRCkpICArICIgYj0iICsgZzEuYiArICIgQT0iICsgKGcxLmIgLSAxKSAvIE1PRCk7CiAgICAgICAgfQogICAgfQogCiAKICAgIGxvbmcgc3FydDUobG9uZyBNT0QpIHsKICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IE1PRDsgKytpKSB7CiAgICAgICAgICAgIGlmIChpICogaSAlIE1PRCA9PSA1KSByZXR1cm4gaTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CiAgICB9CiAKIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3IE1haW4oKS5ydW4oKTsKICAgIH0KIAogICAgc3RhdGljIHZvaWQgdHIoT2JqZWN0Li4uIG9iamVjdHMpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLmRlZXBUb1N0cmluZyhvYmplY3RzKSk7CiAgICB9Cn0KIA==