#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <complex>
using namespace std;
const int pp = 29;
typedef complex<double> cdbl;
int main() {
clock_t start = clock();
cdbl ff[pp], gg[pp];
for(int ii = 0; ii < pp; ii++) {
ff[ii] = gg[ii] = 1.0;
}
for(int it = 0; it < 1000; it++) {
cdbl dual[pp];
for(int ii = 0; ii < pp; ii++) {
dual[ii] = 0.0;
}
for(int h1 = 0; h1 < pp; h1 ++) {
for(int h2 = 0; h2 < pp; h2 ++) {
cdbl avg_right = 0.0;
for(int xx = 0; xx < pp; xx ++) {
int c00 = xx, c01 = (xx + h1) % pp, c10 = (xx + h2) % pp,
c11 = (xx + h1 + h2) % pp;
avg_right += ff[c00] * conj(ff[c01]) * conj(ff[c10]) * gg[c11];
}
avg_right /= static_cast<cdbl>(pp);
for(int xx = 0; xx < pp; xx ++) {
int c01 = (xx + h1) % pp, c10 = (xx + h2) % pp,
c11 = (xx + h1 + h2) % pp;
dual[xx] += conj(ff[c01]) * conj(ff[c10]) * ff[c11] * conj(avg_right);
}
}
}
for(int ii = 0; ii < pp; ii++) {
dual[ii] = conj(dual[ii]) / static_cast<double>(pp*pp);
}
for(int ii = 0; ii < pp; ii++) {
gg[ii] = dual[ii];
}
}
printf("%.15lf\n", gg[0].real());
printf( "%lf\n" , ( double )( clock() - start ) / ( double )CLOCKS_PER_SEC );
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGNvbXBsZXg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IHBwID0gMjk7CnR5cGVkZWYgY29tcGxleDxkb3VibGU+IGNkYmw7CgppbnQgbWFpbigpIHsKY2xvY2tfdCBzdGFydCA9IGNsb2NrKCk7CiAgY2RibCBmZltwcF0sIGdnW3BwXTsKICBmb3IoaW50IGlpID0gMDsgaWkgPCBwcDsgaWkrKykgewogICAgZmZbaWldID0gZ2dbaWldID0gMS4wOwogIH0KCiAgZm9yKGludCBpdCA9IDA7IGl0IDwgMTAwMDsgaXQrKykgewogICAgY2RibCBkdWFsW3BwXTsKCiAgICBmb3IoaW50IGlpID0gMDsgaWkgPCBwcDsgaWkrKykgewogICAgICBkdWFsW2lpXSA9IDAuMDsKICAgIH0KCiAgICBmb3IoaW50IGgxID0gMDsgaDEgPCBwcDsgaDEgKyspIHsKICAgICAgZm9yKGludCBoMiA9IDA7IGgyIDwgcHA7IGgyICsrKSB7CiAgICAgICAgY2RibCBhdmdfcmlnaHQgPSAwLjA7CiAgICAgICAgZm9yKGludCB4eCA9IDA7IHh4IDwgcHA7IHh4ICsrKSB7CiAgICAgICAgICBpbnQgYzAwID0geHgsIGMwMSA9ICh4eCArIGgxKSAlIHBwLCBjMTAgPSAoeHggKyBoMikgJSBwcCwgCiAgICAgICAgICAgICAgYzExID0gKHh4ICsgaDEgKyBoMikgJSBwcDsKICAgICAgICAgIGF2Z19yaWdodCArPSBmZltjMDBdICogY29uaihmZltjMDFdKSAqIGNvbmooZmZbYzEwXSkgKiBnZ1tjMTFdOwogICAgICAgIH0KICAgICAgICBhdmdfcmlnaHQgLz0gc3RhdGljX2Nhc3Q8Y2RibD4ocHApOwoKICAgICAgICBmb3IoaW50IHh4ID0gMDsgeHggPCBwcDsgeHggKyspIHsKICAgICAgICAgIGludCBjMDEgPSAoeHggKyBoMSkgJSBwcCwgYzEwID0gKHh4ICsgaDIpICUgcHAsIAogICAgICAgICAgICAgIGMxMSA9ICh4eCArIGgxICsgaDIpICUgcHA7CiAgICAgICAgICBkdWFsW3h4XSArPSBjb25qKGZmW2MwMV0pICogY29uaihmZltjMTBdKSAqIGZmW2MxMV0gKiBjb25qKGF2Z19yaWdodCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IoaW50IGlpID0gMDsgaWkgPCBwcDsgaWkrKykgewogICAgICBkdWFsW2lpXSA9IGNvbmooZHVhbFtpaV0pIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihwcCpwcCk7CiAgICB9CgogICAgZm9yKGludCBpaSA9IDA7IGlpIDwgcHA7IGlpKyspIHsKICAgICAgZ2dbaWldID0gZHVhbFtpaV07CiAgICB9CgoKICB9CiAgcHJpbnRmKCIlLjE1bGZcbiIsIGdnWzBdLnJlYWwoKSk7CiAgcHJpbnRmKCAiJWxmXG4iICwgKCBkb3VibGUgKSggY2xvY2soKSAtIHN0YXJ0ICkgLyAoIGRvdWJsZSApQ0xPQ0tTX1BFUl9TRUMgKTsKICByZXR1cm4gMDsKfQ==