#include <stdio.h>
#include <math.h>
int a, b;
int mm, nn;
int t;
float pi = 3.1415926535897932384626433832795;
float pi7 = 0.4487989505128276054946633404685;
float r7 = 2.6457513110645905905016157536393;
float sn2, sn4, sn8;
float cs2, cs4, cs8;
float tn2, tn4, tn8;
float alpha, beta, gamma;
#define MAX 128
typedef char Str[MAX];
///////////////////////////////
int ct = 1;
int cvt(float x) {
if (x > 0.0)
return (int)(x+0.9);
if (x < 0.0)
return (int)(x-0.9);
return 0;
}
float xabs(float x) {
if (x < 0.0)
return -x;
return x;
}
float croot(float num) {
int flag = 1.0;
float x;
if (num < 0.0) {
flag = -1.0;
num = -num;
}
// printf("croot: num = %f, x = %f\n", num, x);
return x;
}
float xsqrt(float num) {
int flag = 1.0;
float x;
if (num < 0.0) {
flag = -1.0;
num = -num;
}
// printf("croot: num = %f, x = %f\n", num, x);
return x;
}
float pwrf(float f, int p) {
int i, neg;
float x = 1.0;
if (p == 0)
return 1.0;
neg = 0;
if (p < 0) {
neg = 1;
p = -p;
}
for (i=0; i< p; i++)
x = x*f;
if (neg == 1)
x = 1.0/x;
return x;
}
int isInt(float x) {
float y = 1.0*cvt(x);
if (xabs(x-y) < 0.01)
return 1;
return 0;
}
//////////////////////////////
int toInt(float x) {
float y;
int u;
if (x > 0.1) {
y = x+0.1;
}
else if (x < 0.1) {
y = x-0.1;
}
else
y = 0.0;
u = (int)(y);
return u;
}
// p >= 0
int pwri(int f, int p) {
int i;
int x = 1;
if (p == 0)
return 1;
for (i=0; i< p; i++)
x = x*f;
return x;
}
void make_eq(int a, int b, int c, Str eq){
if (a < -1) {
sprintf(eq
, "%s - %d x^2", eq
, -a
); }
else if (a == -1) {
}
else if (a > 1) {
}
else if (a == 1) {
}
if (b < -1) {
}
else if (b == -1) {
}
else if (b > 1) {
}
else if (b == 1) {
}
if (c < -1) {
}
else if (c == -1) {
}
else if (c > 1) {
}
else if (c == 1) {
}
}
//////////////////////////////////////////////
int tt(int k) {
int x;
x = k*k*k - 3*(a+b+3)*k-(a*b + 6*(a + b) + 9);
return x;
}
void print_abg(){
printf("\\alpha = \\frac{(2\\cos(2\\theta)^%d}{(2\\cos(4\\theta)^%d},\n", mm
, nn
); printf("\\beta = \\frac{(2\\cos(4\\theta)^%d}{(2\\cos(8\\theta)^%d},\n", mm
, nn
); printf("\\gamma = \\frac{(2\\cos(8\\theta)^%d}{(2\\cos(2\\theta)^%d}.\n", mm
, nn
);
}
void process(int sel) {
int k, t;
int x, y;
Str eq;
if (sel == 1) {
if ((a+b+3) == 0) {
x = a*b-9;
make_eq(-a, b, -1, eq);
printf("\\begin{theorem} \\label{tmn_%d_%d} \n", mm
, nn
); print_abg();
printf("Then $ \\{ \\alpha, \\beta, \\gamma \\} $ are roots of the equation:\n");
printf("\\begin{equation} \\label{emn_%d_%d} \n", mm
, nn
); printf("which satisfies Rammnujan condition. \n");
if (x >= 0) {
printf("\\begin{equation} \\label{fmn_%d_%d} \n", mm
, nn
); printf("\\sqrt[3]{\\alpha} + \\sqrt[3]{\\beta} + \\sqrt[3]{\\gamma} = \n"); printf("\\sqrt[3]{%d + 3\\sqrt[3]{%d}} \n", a
+6, x
); printf("\\begin{equation} \\label{gmn_%d_%d} \n", mm
, nn
); printf("\\frac{1}{\\sqrt[3]{\\alpha}} + \\frac{1}{\\sqrt[3]{\\beta}} + \\frac{1}{\\sqrt[3]{\\gamma}} = \n"); printf("\\sqrt[3]{%d + 3\\sqrt[3]{%d}} \n", b
+6, x
); }
else {
printf("\\begin{equation} \\label{fmn_%d_%d} \n", mm
, nn
); printf("\\sqrt[3]{\\alpha} + \\sqrt[3]{\\beta} + \\sqrt[3]{\\gamma} = \n"); printf("\\sqrt[3]{%d - 3\\sqrt[3]{%d}} \n", a
+6, -x
); printf("\\begin{equation} \\label{gmn_%d_%d} \n", mm
, nn
); printf("\\frac{1}{\\sqrt[3]{\\alpha}} + \\frac{1}{\\sqrt[3]{\\beta}} + \\frac{1}{\\sqrt[3]{\\gamma}} = \n"); printf("\\sqrt[3]{%d - 3\\sqrt[3]{%d}} \n", b
+6, -x
); }
return;
}
}
if (sel == 2) {
for (k = -1000; k<= 1000; k++) {
if (tt(k) == 0) {
t = k;
// printf("(%3d,%3d}: a = %6d, b = %6d, t = %6d \n", mm, nn, a, b, t);
// sum a = \sqrt[3]{a+6+3t},
// sum b = \sqrt[3]{b+6+3t},
x = a+6+3*t;
y = b+6+3*t;
make_eq(-a, b, -1, eq);
printf("\\begin{theorem} \\label{tmn_%d_%d} \n", mm
, nn
); print_abg();
printf("Then $ \\{ \\alpha, \\beta, \\gamma \\} $ are roots of the equation:\n");
printf("\\begin{equation} \\label{emn_%d_%d} \n", mm
, nn
); printf("The associatd Rammnujan equation has integer solution $ %d $. \n", t
);
if (x >= 0) {
printf("\\begin{equation} \\label{fmn_%d_%d} \n", mm
, nn
); printf("\\sqrt[3]{\\alpha} + \\sqrt[3]{\\beta} + \\sqrt[3]{\\gamma} = \n"); printf("\\sqrt[3]{%d} \n", x
); }
else {
printf("\\begin{equation} \\label{fmn_%d_%d} \n", mm
, nn
); printf("\\sqrt[3]{\\alpha} + \\sqrt[3]{\\beta} + \\sqrt[3]{\\gamma} = \n"); printf("-\\sqrt[3]{%d} \n", -x
); }
if (y >= 0) {
printf("\\begin{equation} \\label{gmn_%d_%d} \n", mm
, nn
); printf("\\frac{1}{\\sqrt[3]{\\alpha}} + \\frac{1}{\\sqrt[3]{\\beta}} + \\frac{1}{\\sqrt[3]{\\gamma}} = \n"); printf(" \\sqrt[3]{%d} \n", y
); }
else {
printf("\\begin{equation} \\label{gmn_%d_%d} \n", mm
, nn
); printf("\\frac{1}{\\sqrt[3]{\\alpha}} + \\frac{1}{\\sqrt[3]{\\beta}} + \\frac{1}{\\sqrt[3]{\\gamma}} = \n"); printf("-\\sqrt[3]{%d} \n", -y
); }
/*
printf(" sum a = %f, expect: %f\n",
croot(1.0*x), croot(alpha) + croot(beta) + croot(gamma));
printf(" sum b = %f, expect: %f\n",
croot(1.0*y), croot(1.0/alpha) + croot(1.0/beta) + croot(1.0/gamma));
if (x >= 0)
printf(" sum a = \\sqrt[3]{%d} \n", x);
else
printf(" sum a = -\\sqrt[3]{%d} \n", -x);
if (y >= 0)
printf(" sum b = \\sqrt[3]{%d} \n", y);
else
printf(" sum b = -\\sqrt[3]{%d} \n", -y);
*/
return;
}
}
}
};
////////////////////////////////////////////////////////
void init () {
}
void comp_ram(int sel) {
/*
float pf, qf, rf, root, r1f, r2f;
int p, q, rr, r2, r12, r22;
printf("alpha = %f\n", alpha);
printf("beta = %f\n", beta);
printf("gammma = %f\n", gamma);
printf("***** (%d,%d) *****\n", mm, nn);
printf("alpha+beta+gamma = %f\n", alpha +beta+gamma);
printf("alpha*beta+beta*gamma+gamma*alpha = %f\n", alpha *beta+beta*gamma+gamma*alpha );
printf("alpha*beta*gamma = %f\n", alpha *beta*gamma);
printf("alpha^(1/3) + beta^(1/3) + gamma^(1/3) = %f\n",
croot(alpha) + croot(beta) + croot(gamma));
printf("(1/alpha)^(1/3) + (1/beta)^(1/3) + 1/(gamma)^(1/3) = %f\n",
croot(1.0/alpha) + croot(1.0/beta) + croot(1.0/gamma));
*/
a = cvt(alpha +beta+gamma);
b = cvt(alpha *beta+beta*gamma+gamma*alpha);
/*
// printf("a = %d, b = %d\n", a, b);
// x = k*k*k - 3*(a+b+3)*k - (a*b + 6*(a + b) + 9);
printf("Ramanujan eq: x^3 - %d x - %d = 0 \n",
3*(a+b+3), a*b + 6*(a + b) + 9);
// x^3 + px = q = 0
// Cardano formula
// root = (-q/2 + (q^2/4+p^3/27)^(1/2))^(1/3) + (-q/2 - (q^2/4+p^3/27)^(1/2))^(1/3)
// r = (q^2/4+p^3/27)^(1/2)
p = -(3*(a+b+3));
q = -(a*b + 6*(a + b) + 9);
printf("p = %d, q = %d\n", p, q);
pf = 1.0*p;
qf = 1.0*q;
rf = sqrt( pwrf(qf,2)/4.0 + pwrf(pf,3)/27.0 );
r2 = q*q + 4*p*p*p /27;
rr = cvt(sqrt(1.0*r2));
printf(" rr = sqrt(%d)/2 = %d/2\n", r2, rr );
printf(" rf = %f\n", rf);
r12 = (-q + rr)/2;
r22 = (-q - rr)/2;
printf("r12 = %d\n", r12);
printf("r22 = %d\n", r22);
r1f = croot(-qf/2.0 + rf );
r2f = croot(-qf/2.0 - rf );
printf(" r12 = (%d)^(1/3) \n", r12);
printf(" r22 = (%d)^(1/3) \n", r22);
printf("root = (%d)^(1/3) + (%d)^(1/3)\n", r12, r22);
root = r1f + r2f;
printf("root = %f, %f + %f \n", root, r1f, r2f);
*/
process(sel);
}
void set_cos_mn(int m, int n) {
alpha = pwrf(2.0*cs2, m)/(pwrf(2.0*cs4, n));
beta = pwrf(2.0*cs4, m)/(pwrf(2.0*cs8, n));
gamma = pwrf(2.0*cs8, m)/(pwrf(2.0*cs2, n));
}
///////////////////////////////////////////////
int main(int argc, char *argv[]) {
int i, j;
int nterm = 100;
init();
for (i=0; i<nterm; i++) {
for (j=0; j<nterm; j++) {
mm = i;
nn = j;
set_cos_mn(i, j);
comp_ram(1);
}
}
printf("End of JOB (%d,%d)\n", mm
, nn
); return 1;
}
I2luY2x1ZGUgPHN0ZGlvLmg+IAojaW5jbHVkZSA8bWF0aC5oPgoKCmludCBhLCBiOyAKaW50IG1tLCBubjsKaW50IHQ7IAoKZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTU7IApmbG9hdCBwaTcgPSAwLjQ0ODc5ODk1MDUxMjgyNzYwNTQ5NDY2MzM0MDQ2ODU7IApmbG9hdCByNyA9IDIuNjQ1NzUxMzExMDY0NTkwNTkwNTAxNjE1NzUzNjM5MzsgCgpmbG9hdCBzbjIsIHNuNCwgc244OyAKZmxvYXQgY3MyLCBjczQsIGNzODsgCmZsb2F0IHRuMiwgdG40LCB0bjg7IAoKZmxvYXQgYWxwaGEsIGJldGEsICBnYW1tYTsgCgoKI2RlZmluZSBNQVggIDEyOAp0eXBlZGVmIGNoYXIgU3RyW01BWF07IAoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwppbnQgY3QgPSAxOyAKCgoKCmludCBjdnQoZmxvYXQgeCkgewogICBpZiAoeCA+IDAuMCkKICAgICAgIHJldHVybiAoaW50KSh4KzAuOSk7IAogICBpZiAoeCA8IDAuMCkKICAgICAgIHJldHVybiAoaW50KSh4LTAuOSk7IAoKICAgcmV0dXJuIDA7IAp9CiAgIAoKZmxvYXQgeGFicyhmbG9hdCB4KSB7CiAgaWYgKHggPCAwLjApIAogICAgIHJldHVybiAteDsgCiAgcmV0dXJuIHg7IAp9IAoKZmxvYXQgY3Jvb3QoZmxvYXQgbnVtKSB7CiAgaW50IGZsYWcgPSAxLjA7CiAgZmxvYXQgeDsgCiAgaWYgKG51bSA8IDAuMCkgewogICAgZmxhZyA9IC0xLjA7CiAgICBudW0gPSAtbnVtOwogIH0KICB4ID0gZmxhZyAqIGV4cChsb2cobnVtKS8zLjApOyAKCi8vIHByaW50ZigiY3Jvb3Q6IG51bSA9ICVmLCB4ID0gJWZcbiIsIG51bSwgeCk7IAoKICByZXR1cm4geDsKfQoKZmxvYXQgeHNxcnQoZmxvYXQgbnVtKSB7CiAgaW50IGZsYWcgPSAxLjA7CiAgZmxvYXQgeDsgCiAgaWYgKG51bSA8IDAuMCkgewogICAgZmxhZyA9IC0xLjA7CiAgICBudW0gPSAtbnVtOwogIH0KICB4ID0gZmxhZyAqIGV4cChsb2cobnVtKS8yLjApOyAKCi8vIHByaW50ZigiY3Jvb3Q6IG51bSA9ICVmLCB4ID0gJWZcbiIsIG51bSwgeCk7IAoKICByZXR1cm4geDsKfQoKZmxvYXQgcHdyZihmbG9hdCBmLCBpbnQgcCkgewogICBpbnQgaSwgbmVnOyAKICAgZmxvYXQgeCA9IDEuMDsKCiAgIGlmIChwID09IDApIAogICAgIHJldHVybiAxLjA7CgogICBuZWcgPSAwOwogICBpZiAocCA8IDApIHsKICAgICAgbmVnID0gMTsKICAgICAgcCA9IC1wOwogICB9CgogICBmb3IgKGk9MDsgaTwgcDsgaSsrKSAKICAgICB4ID0geCpmOwogCiAgIGlmIChuZWcgPT0gMSkgCiAgICAgIHggPSAxLjAveDsKCiAgIHJldHVybiB4Owp9CgppbnQgaXNJbnQoZmxvYXQgeCkgewogICBmbG9hdCB5ID0gMS4wKmN2dCh4KTsgCgogICBpZiAoeGFicyh4LXkpIDwgMC4wMSkgCiAgICAgIHJldHVybiAxOyAKCiAgIHJldHVybiAwOyAKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmludCB0b0ludChmbG9hdCB4KSB7CiAgIGZsb2F0IHk7IAogICBpbnQgdTsKCiAgIGlmICh4ID4gMC4xKSB7CiAgICAgICB5ID0geCswLjE7IAogICB9CiAgIGVsc2UgaWYgKHggPCAwLjEpIHsgCiAgICAgICB5ID0geC0wLjE7IAogICB9CiAgIGVsc2UgCiAgICAgICB5ID0gMC4wOwoKICAgdSA9IChpbnQpKHkpOwogCgoKICAgcmV0dXJuIHU7IAp9CgoKCgovLyBwID49IDAgCmludCBwd3JpKGludCBmLCBpbnQgcCkgewogICBpbnQgaTsgCiAgIGludCB4ID0gMTsKCiAgIGlmIChwID09IDApIAogICAgIHJldHVybiAxOwoKCiAgIGZvciAoaT0wOyBpPCBwOyBpKyspIAogICAgIHggPSB4KmY7CgogICByZXR1cm4geDsKfQoKCnZvaWQgbWFrZV9lcShpbnQgYSwgaW50IGIsIGludCBjLCBTdHIgZXEpewoKICAgc3ByaW50ZihlcSwgInheMyIpOyAgCiAgIGlmIChhIDwgLTEpIHsKICAgICAgc3ByaW50ZihlcSwgIiVzIC0gJWQgeF4yIiwgZXEsIC1hKTsgCiAgIH0KICAgZWxzZSBpZiAoYSA9PSAtMSkgewogICAgICBzcHJpbnRmKGVxLCAiJXMgLSB4XjIiLCBlcSk7IAogICB9CiAgIGVsc2UgaWYgKGEgPiAxKSB7CiAgICAgIHNwcmludGYoZXEsICIlcyArICVkIHheMiIsIGVxLCBhKTsgCiAgIH0KICAgZWxzZSBpZiAoYSA9PSAxKSB7CiAgICAgIHNwcmludGYoZXEsICIlcyArIHheMiIsIGVxKTsgCiAgIH0KCiAgIGlmIChiIDwgLTEpIHsKICAgICAgc3ByaW50ZihlcSwgIiVzIC0gJWQgeCIsIGVxLCAtYik7IAogICB9CiAgIGVsc2UgaWYgKGIgPT0gLTEpIHsKICAgICAgc3ByaW50ZihlcSwgIiVzIC0geF4yIiwgZXEpOyAKICAgfQogICBlbHNlIGlmIChiID4gMSkgewogICAgICBzcHJpbnRmKGVxLCAiJXMgKyAlZCB4XjIiLCBlcSwgYik7IAogICB9CiAgIGVsc2UgaWYgKGIgPT0gMSkgewogICAgICBzcHJpbnRmKGVxLCAiJXMgKyB4XjIiLCBlcSk7IAogICB9CgoKICAgaWYgKGMgPCAtMSkgewogICAgICBzcHJpbnRmKGVxLCAiJXMgLSAlZCIsIGVxLCAtYyk7IAogICB9CiAgIGVsc2UgaWYgKGMgPT0gLTEpIHsKICAgICAgc3ByaW50ZihlcSwgIiVzIC0gMSIsIGVxKTsgCiAgIH0KICAgZWxzZSBpZiAoYyA+IDEpIHsKICAgICAgc3ByaW50ZihlcSwgIiVzICsgJWQiLCBlcSwgYyk7IAogICB9CiAgIGVsc2UgaWYgKGMgPT0gMSkgewogICAgICBzcHJpbnRmKGVxLCAiJXMgKyAxIiwgZXEpOyAKICAgfQoKICAgICAgCiAgICBzcHJpbnRmKGVxLCAiJXMgPSAwIiwgZXEpOyAKICAgCgp9CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKaW50IHR0KGludCBrKSB7CmludCB4OyAKICAgeCA9IGsqayprIC0gMyooYStiKzMpKmstKGEqYiArIDYqKGEgKyBiKSArIDkpOwogICByZXR1cm4geDsgCn0KCgp2b2lkIHByaW50X2FiZygpewoKcHJpbnRmKCJcXGFscGhhID0gXFxmcmFjeygyXFxjb3MoMlxcdGhldGEpXiVkfXsoMlxcY29zKDRcXHRoZXRhKV4lZH0sXG4iLCBtbSwgbm4pOyAKcHJpbnRmKCJcXGJldGEgID0gXFxmcmFjeygyXFxjb3MoNFxcdGhldGEpXiVkfXsoMlxcY29zKDhcXHRoZXRhKV4lZH0sXG4iLCBtbSwgbm4pOyAKcHJpbnRmKCJcXGdhbW1hID0gXFxmcmFjeygyXFxjb3MoOFxcdGhldGEpXiVkfXsoMlxcY29zKDJcXHRoZXRhKV4lZH0uXG4iLCBtbSwgbm4pOyAKCn0KCgp2b2lkIHByb2Nlc3MoaW50IHNlbCkgewppbnQgaywgdDsKaW50IHgsIHk7IApTdHIgZXE7IAoKaWYgKHNlbCA9PSAxKSB7CiAgIGlmICgoYStiKzMpID09IDApIHsKICAgICAgIHggPSBhKmItOTsgCgogICAgICAgbWFrZV9lcSgtYSwgYiwgLTEsIGVxKTsgCgoKCnByaW50ZigiXFxiZWdpbnt0aGVvcmVtfSBcXGxhYmVse3Rtbl8lZF8lZH0gXG4iLCBtbSwgbm4pOyAKcHJpbnRmKCJMZXQgXG4iKTsgCnByaW50ZigiJCRcbiIpOyAKcHJpbnRfYWJnKCk7IApwcmludGYoIiQkXG4iKTsgCgoKcHJpbnRmKCJUaGVuICQgXFx7IFxcYWxwaGEsIFxcYmV0YSwgXFxnYW1tYSBcXH0gJCBhcmUgcm9vdHMgb2YgdGhlIGVxdWF0aW9uOlxuIik7IAoKcHJpbnRmKCJcXGJlZ2lue2VxdWF0aW9ufSBcXGxhYmVse2Vtbl8lZF8lZH0gXG4iLCBtbSwgbm4pOyAKcHJpbnRmKCIlc1xuIiwgZXEpOyAKcHJpbnRmKCJcXGVuZHtlcXVhdGlvbn0gIFxuIik7IApwcmludGYoIndoaWNoIHNhdGlzZmllcyBSYW1tbnVqYW4gY29uZGl0aW9uLiBcbiIpOyAKcHJpbnRmKCJBbmQgXG4iKTsgCgppZiAoeCA+PSAwKSB7CnByaW50ZigiXFxiZWdpbntlcXVhdGlvbn0gXFxsYWJlbHtmbW5fJWRfJWR9IFxuIiwgbW0sIG5uKTsgCnByaW50ZigiXFxzcXJ0WzNde1xcYWxwaGF9ICsgXFxzcXJ0WzNde1xcYmV0YX0gKyBcXHNxcnRbM117XFxnYW1tYX0gPSBcbiIpOyAKcHJpbnRmKCJcXHNxcnRbM117JWQgKyAzXFxzcXJ0WzNdeyVkfX0gIFxuIiwgYSs2LCB4KTsgCnByaW50ZigiXFxlbmR7ZXF1YXRpb259ICBcbiIpOyAKcHJpbnRmKCJcXGJlZ2lue2VxdWF0aW9ufSBcXGxhYmVse2dtbl8lZF8lZH0gXG4iLCBtbSwgbm4pOyAKcHJpbnRmKCJcXGZyYWN7MX17XFxzcXJ0WzNde1xcYWxwaGF9fSArIFxcZnJhY3sxfXtcXHNxcnRbM117XFxiZXRhfX0gKyBcXGZyYWN7MX17XFxzcXJ0WzNde1xcZ2FtbWF9fSA9IFxuIik7IApwcmludGYoIlxcc3FydFszXXslZCArIDNcXHNxcnRbM117JWR9fSAgXG4iLCBiKzYsIHgpOyAKcHJpbnRmKCJcXGVuZHtlcXVhdGlvbn0gIFxuIik7IAp9CgplbHNlIHsKcHJpbnRmKCJcXGJlZ2lue2VxdWF0aW9ufSBcXGxhYmVse2Ztbl8lZF8lZH0gXG4iLCBtbSwgbm4pOyAKcHJpbnRmKCJcXHNxcnRbM117XFxhbHBoYX0gKyBcXHNxcnRbM117XFxiZXRhfSArIFxcc3FydFszXXtcXGdhbW1hfSA9IFxuIik7IApwcmludGYoIlxcc3FydFszXXslZCAtIDNcXHNxcnRbM117JWR9fSAgXG4iLCBhKzYsIC14KTsgCnByaW50ZigiXFxlbmR7ZXF1YXRpb259ICBcbiIpOyAKcHJpbnRmKCJcXGJlZ2lue2VxdWF0aW9ufSBcXGxhYmVse2dtbl8lZF8lZH0gXG4iLCBtbSwgbm4pOyAKcHJpbnRmKCJcXGZyYWN7MX17XFxzcXJ0WzNde1xcYWxwaGF9fSArIFxcZnJhY3sxfXtcXHNxcnRbM117XFxiZXRhfX0gKyBcXGZyYWN7MX17XFxzcXJ0WzNde1xcZ2FtbWF9fSA9IFxuIik7IApwcmludGYoIlxcc3FydFszXXslZCAtIDNcXHNxcnRbM117JWR9fSAgXG4iLCBiKzYsIC14KTsgCnByaW50ZigiXFxlbmR7ZXF1YXRpb259ICBcbiIpOyAKfQoKcHJpbnRmKCJcXGVuZHt0aGVvcmVtfVxuXG4iKTsgCgoKICAgICAgcmV0dXJuOyAKICAgfQp9CgppZiAoc2VsID09IDIpIHsKICAgZm9yIChrID0gLTEwMDA7IGs8PSAxMDAwOyBrKyspIHsKICAgICAgIGlmICh0dChrKSA9PSAwKSB7CiAgICAgICAgICB0ID0gazsgCgovLyAgICAgICAgICBwcmludGYoIiglM2QsJTNkfTogYSA9ICU2ZCwgYiA9ICU2ZCwgdCA9ICU2ZCAgXG4iLCBtbSwgbm4sIGEsIGIsIHQpOyAKCiAgICAgICAgICAvLyBzdW0gYSA9IFxzcXJ0WzNde2ErNiszdH0sCiAgICAgICAgICAvLyBzdW0gYiA9IFxzcXJ0WzNde2IrNiszdH0sCiAgICAgICAgICB4ID0gYSs2KzMqdDsKICAgICAgICAgIHkgPSBiKzYrMyp0OwogICAKICAgICAgIG1ha2VfZXEoLWEsIGIsIC0xLCBlcSk7IAoKCnByaW50ZigiXFxiZWdpbnt0aGVvcmVtfSBcXGxhYmVse3Rtbl8lZF8lZH0gXG4iLCBtbSwgbm4pOyAKcHJpbnRmKCJMZXQgXG4iKTsgCnByaW50ZigiJCRcbiIpOyAKcHJpbnRfYWJnKCk7IApwcmludGYoIiQkXG4iKTsgCgpwcmludGYoIlRoZW4gJCBcXHsgXFxhbHBoYSwgXFxiZXRhLCBcXGdhbW1hIFxcfSAkIGFyZSByb290cyBvZiB0aGUgZXF1YXRpb246XG4iKTsgCgpwcmludGYoIlxcYmVnaW57ZXF1YXRpb259IFxcbGFiZWx7ZW1uXyVkXyVkfSBcbiIsIG1tLCBubik7IApwcmludGYoIiVzXG4iLCBlcSk7IApwcmludGYoIlxcZW5ke2VxdWF0aW9ufSAgXG4iKTsgCnByaW50ZigiVGhlIGFzc29jaWF0ZCBSYW1tbnVqYW4gZXF1YXRpb24gaGFzIGludGVnZXIgc29sdXRpb24gJCAlZCAkLiBcbiIsIHQpOyAKcHJpbnRmKCJBbmQgXG4iKTsgCgppZiAoeCA+PSAwKSB7CnByaW50ZigiXFxiZWdpbntlcXVhdGlvbn0gXFxsYWJlbHtmbW5fJWRfJWR9IFxuIiwgbW0sIG5uKTsgCnByaW50ZigiXFxzcXJ0WzNde1xcYWxwaGF9ICsgXFxzcXJ0WzNde1xcYmV0YX0gKyBcXHNxcnRbM117XFxnYW1tYX0gPSBcbiIpOyAKcHJpbnRmKCJcXHNxcnRbM117JWR9IFxuIiwgeCk7IApwcmludGYoIlxcZW5ke2VxdWF0aW9ufSAgXG4iKTsgCn0KCmVsc2UgewpwcmludGYoIlxcYmVnaW57ZXF1YXRpb259IFxcbGFiZWx7Zm1uXyVkXyVkfSBcbiIsIG1tLCBubik7IApwcmludGYoIlxcc3FydFszXXtcXGFscGhhfSArIFxcc3FydFszXXtcXGJldGF9ICsgXFxzcXJ0WzNde1xcZ2FtbWF9ID0gXG4iKTsgCnByaW50ZigiLVxcc3FydFszXXslZH0gXG4iLCAteCk7IApwcmludGYoIlxcZW5ke2VxdWF0aW9ufSAgXG4iKTsgCn0KCmlmICh5ID49IDApIHsKcHJpbnRmKCJcXGJlZ2lue2VxdWF0aW9ufSBcXGxhYmVse2dtbl8lZF8lZH0gXG4iLCBtbSwgbm4pOyAKcHJpbnRmKCJcXGZyYWN7MX17XFxzcXJ0WzNde1xcYWxwaGF9fSArIFxcZnJhY3sxfXtcXHNxcnRbM117XFxiZXRhfX0gKyBcXGZyYWN7MX17XFxzcXJ0WzNde1xcZ2FtbWF9fSA9IFxuIik7IApwcmludGYoIiBcXHNxcnRbM117JWR9IFxuIiwgeSk7IApwcmludGYoIlxcZW5ke2VxdWF0aW9ufSAgXG4iKTsgCn0KCmVsc2UgewpwcmludGYoIlxcYmVnaW57ZXF1YXRpb259IFxcbGFiZWx7Z21uXyVkXyVkfSBcbiIsIG1tLCBubik7IApwcmludGYoIlxcZnJhY3sxfXtcXHNxcnRbM117XFxhbHBoYX19ICsgXFxmcmFjezF9e1xcc3FydFszXXtcXGJldGF9fSArIFxcZnJhY3sxfXtcXHNxcnRbM117XFxnYW1tYX19ID0gXG4iKTsgCnByaW50ZigiLVxcc3FydFszXXslZH0gXG4iLCAteSk7IApwcmludGYoIlxcZW5ke2VxdWF0aW9ufSAgXG4iKTsgCn0KcHJpbnRmKCJcXGVuZHt0aGVvcmVtfVxuXG4iKTsgCgoKLyoKICAgICAgICAgIHByaW50ZigiICAgICBzdW0gYSA9ICVmLCBleHBlY3Q6ICVmXG4iLCAKICAgICAgICAgICAgICAgY3Jvb3QoMS4wKngpLCBjcm9vdChhbHBoYSkgKyBjcm9vdChiZXRhKSArIGNyb290KGdhbW1hKSk7ICAKICAgICAgICAgIHByaW50ZigiICAgICBzdW0gYiA9ICVmLCBleHBlY3Q6ICVmXG4iLAogICAgICAgICAgICAgICBjcm9vdCgxLjAqeSksIGNyb290KDEuMC9hbHBoYSkgKyBjcm9vdCgxLjAvYmV0YSkgKyBjcm9vdCgxLjAvZ2FtbWEpKTsgCiAgICAgICAgICBpZiAoeCA+PSAwKSAKICAgICAgICAgICAgICBwcmludGYoIiAgICAgc3VtIGEgPSAgXFxzcXJ0WzNdeyVkfSBcbiIsIHgpOyAKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBwcmludGYoIiAgICAgc3VtIGEgPSAgLVxcc3FydFszXXslZH0gXG4iLCAteCk7IAoKICAgICAgICAgIGlmICh5ID49IDApIAogICAgICAgICAgICAgIHByaW50ZigiICAgICBzdW0gYiA9ICBcXHNxcnRbM117JWR9IFxuIiwgeSk7IAogICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHByaW50ZigiICAgICBzdW0gYiA9ICAtXFxzcXJ0WzNdeyVkfSBcbiIsIC15KTsgCiovCgogICAgICAgICAgIHJldHVybjsgCiAgICAgICB9CiAgIH0KfQoKfTsKIAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCnZvaWQgaW5pdCAoKSB7CiAgIHNuMiA9IHNpbigyKnBpNyk7CiAgIHNuNCA9IHNpbig0KnBpNyk7CiAgIHNuOCA9IHNpbig4KnBpNyk7CgogICBjczIgPSBjb3MoMipwaTcpOwogICBjczQgPSBjb3MoNCpwaTcpOwogICBjczggPSBjb3MoOCpwaTcpOwoKICAgdG4yID0gdGFuKDIqcGk3KTsKICAgdG40ID0gdGFuKDQqcGk3KTsKICAgdG44ID0gdGFuKDgqcGk3KTsKCgoKICAgCn0KCgoKCgoKdm9pZCBjb21wX3JhbShpbnQgc2VsKSB7CgoKLyoKZmxvYXQgIHBmLCBxZiwgcmYsIHJvb3QsIHIxZiwgcjJmOyAKaW50IHAsIHEsIHJyLCByMiwgcjEyLCByMjI7IAoKcHJpbnRmKCJhbHBoYSAgPSAlZlxuIiwgYWxwaGEpOyAKcHJpbnRmKCJiZXRhICA9ICVmXG4iLCBiZXRhKTsgCnByaW50ZigiZ2FtbW1hICA9ICVmXG4iLCBnYW1tYSk7IAoKCgoKcHJpbnRmKCIqKioqKiAoJWQsJWQpICoqKioqXG4iLCBtbSwgbm4pOyAKCgoKcHJpbnRmKCJhbHBoYStiZXRhK2dhbW1hID0gJWZcbiIsIGFscGhhICtiZXRhK2dhbW1hKTsgCnByaW50ZigiYWxwaGEqYmV0YStiZXRhKmdhbW1hK2dhbW1hKmFscGhhID0gJWZcbiIsIGFscGhhICpiZXRhK2JldGEqZ2FtbWErZ2FtbWEqYWxwaGEgKTsgCnByaW50ZigiYWxwaGEqYmV0YSpnYW1tYSA9ICVmXG4iLCBhbHBoYSAqYmV0YSpnYW1tYSk7IAoKCnByaW50ZigiYWxwaGFeKDEvMykgKyBiZXRhXigxLzMpICsgZ2FtbWFeKDEvMykgPSAlZlxuIiwgCmNyb290KGFscGhhKSArIGNyb290KGJldGEpICsgY3Jvb3QoZ2FtbWEpKTsgCgpwcmludGYoIigxL2FscGhhKV4oMS8zKSArICgxL2JldGEpXigxLzMpICsgMS8oZ2FtbWEpXigxLzMpID0gJWZcbiIsIApjcm9vdCgxLjAvYWxwaGEpICsgY3Jvb3QoMS4wL2JldGEpICsgY3Jvb3QoMS4wL2dhbW1hKSk7IAoKKi8KCmEgPSBjdnQoYWxwaGEgK2JldGErZ2FtbWEpOyAKYiA9IGN2dChhbHBoYSAqYmV0YStiZXRhKmdhbW1hK2dhbW1hKmFscGhhKTsgCgoKCgoKLyoKCi8vIHByaW50ZigiYSA9ICVkLCBiID0gJWRcbiIsIGEsIGIpOyAKCi8vICB4ID0gayprKmsgLSAzKihhK2IrMykqayAtIChhKmIgKyA2KihhICsgYikgKyA5KTsKCnByaW50ZigiUmFtYW51amFuIGVxOiAgeF4zIC0gJWQgeCAtICVkID0gMCBcbiIsIAogMyooYStiKzMpLCBhKmIgKyA2KihhICsgYikgKyA5KTsgCgovLyB4XjMgKyBweCA9IHEgPSAwIAovLyBDYXJkYW5vIGZvcm11bGEgCi8vIHJvb3QgPSAoLXEvMiArIChxXjIvNCtwXjMvMjcpXigxLzIpKV4oMS8zKSArICgtcS8yIC0gKHFeMi80K3BeMy8yNyleKDEvMikpXigxLzMpCi8vIHIgPSAocV4yLzQrcF4zLzI3KV4oMS8yKQpwID0gLSgzKihhK2IrMykpOyAKcSA9IC0oYSpiICsgNiooYSArIGIpICsgOSk7CgpwcmludGYoInAgPSAlZCwgcSA9ICVkXG4iLCBwLCBxKTsgCnBmID0gMS4wKnA7CnFmID0gMS4wKnE7CgpyZiA9IHNxcnQoIHB3cmYocWYsMikvNC4wICsgcHdyZihwZiwzKS8yNy4wICk7IApyMiA9IHEqcSArIDQqcCpwKnAgLzI3OyAKcnIgPSBjdnQoc3FydCgxLjAqcjIpKTsgIAoKcHJpbnRmKCIgcnIgPSBzcXJ0KCVkKS8yID0gJWQvMlxuIiwgcjIsIHJyICk7CnByaW50ZigiIHJmID0gJWZcbiIsIHJmKTsKCnIxMiA9ICgtcSArIHJyKS8yOwpyMjIgPSAoLXEgLSBycikvMjsKCnByaW50ZigicjEyID0gJWRcbiIsIHIxMik7IApwcmludGYoInIyMiA9ICVkXG4iLCByMjIpOyAKCgpyMWYgPSBjcm9vdCgtcWYvMi4wICsgcmYgKTsgCnIyZiA9IGNyb290KC1xZi8yLjAgLSByZiApOyAKCnByaW50ZigiIHIxMiA9ICglZCleKDEvMykgXG4iLCByMTIpOwpwcmludGYoIiByMjIgPSAoJWQpXigxLzMpIFxuIiwgcjIyKTsKcHJpbnRmKCJyb290ID0gKCVkKV4oMS8zKSArICglZCleKDEvMylcbiIsIHIxMiwgcjIyKTsgCgpyb290ID0gcjFmICsgcjJmOyAKcHJpbnRmKCJyb290ID0gJWYsICVmICsgJWYgXG4iLCByb290LCByMWYsIHIyZik7IAoKKi8gCgoKcHJvY2VzcyhzZWwpOyAKCgp9Cgp2b2lkIHNldF9jb3NfbW4oaW50IG0sIGludCBuKSB7CgoKYWxwaGEgPSBwd3JmKDIuMCpjczIsIG0pLyhwd3JmKDIuMCpjczQsIG4pKTsKYmV0YSAgPSBwd3JmKDIuMCpjczQsIG0pLyhwd3JmKDIuMCpjczgsIG4pKTsKZ2FtbWEgPSBwd3JmKDIuMCpjczgsIG0pLyhwd3JmKDIuMCpjczIsIG4pKTsKCgp9CgoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgaW50IGksIGo7IAogICBpbnQgbnRlcm0gPSAxMDA7IAogICBpbml0KCk7IAoKCiAgIGZvciAoaT0wOyBpPG50ZXJtOyBpKyspIHsKICAgICAgZm9yIChqPTA7IGo8bnRlcm07IGorKykgewogICAgICAgICAgIG1tID0gaTsKICAgICAgICAgICBubiA9IGo7IAoKICAgICAgICAgIHNldF9jb3NfbW4oaSwgaik7IAogICAgICAgICAgY29tcF9yYW0oMSk7IAoKICAgICAgIH0KICAgfQoKCgoKcHJpbnRmKCJFbmQgb2YgSk9CICglZCwlZClcbiIsIG1tLCBubik7IApyZXR1cm4gMTsgCgp9Cgo=