#include <vector>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double bernoulli(int n)
{
static vector<double> b{1.0, -0.5, 1.0/6.0, 0.0};
if (n < b.size()) return b[n];
if (n%2 && n > 2) return 0;
if (n < 20)
{
double sum = 0;
double a = -1;
for(int k = 1; k <= n; ++k)
{
a = a*(n-k+1)/(k+1);
sum += a*bernoulli(n-k);
}
b.resize(n+1);
b[n] = sum;
return sum;
}
else
{
const double pi = 3.14159265358, e = 2.718281828459045;
return ((n/2%2)*2-1)*4*pi*pow(n/(2.*pi*e),0.5+n)*
exp(0.5+1./(12.*n)-1./(360.*n*n*n)+1./(1260.*n*n*n*n*n));
}
}
double series(double x, double eps)
{
double sum = 1, a = 1, z = 1;
for(int n = 1; abs(z) > eps; ++n)
{
a = -a * 2*x*x/n/(2*n-1);
z = a * bernoulli(2*n);
sum += z;
}
return sum/x;
}
int main()
{
for(double x = -3.1; x < 3.11; x += 0.05)
{
double y = series(x,1e-9);
cout
<< setw(5) << x << setw(10) << 1/tan(x)
<< setw(10) << y << endl;
}
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNtYXRoPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmRvdWJsZSBiZXJub3VsbGkoaW50IG4pCnsKICAgIHN0YXRpYyB2ZWN0b3I8ZG91YmxlPiBiezEuMCwgLTAuNSwgMS4wLzYuMCwgMC4wfTsKICAgIGlmIChuIDwgYi5zaXplKCkpIHJldHVybiBiW25dOwogICAgaWYgKG4lMiAmJiBuID4gMikgcmV0dXJuIDA7CiAgICBpZiAobiA8IDIwKQogICAgewogICAgICAgIGRvdWJsZSBzdW0gPSAwOwogICAgICAgIGRvdWJsZSBhID0gLTE7CiAgICAgICAgZm9yKGludCBrID0gMTsgayA8PSBuOyArK2spCiAgICAgICAgewogICAgICAgICAgICBhID0gYSoobi1rKzEpLyhrKzEpOwogICAgICAgICAgICBzdW0gKz0gYSpiZXJub3VsbGkobi1rKTsKICAgICAgICB9CiAgICAgICAgYi5yZXNpemUobisxKTsKICAgICAgICBiW25dID0gc3VtOwogICAgICAgIHJldHVybiBzdW07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgY29uc3QgZG91YmxlIHBpID0gMy4xNDE1OTI2NTM1OCwgZSA9IDIuNzE4MjgxODI4NDU5MDQ1OwogICAgICAgIHJldHVybiAoKG4vMiUyKSoyLTEpKjQqcGkqcG93KG4vKDIuKnBpKmUpLDAuNStuKSoKICAgICAgICAgICAgZXhwKDAuNSsxLi8oMTIuKm4pLTEuLygzNjAuKm4qbipuKSsxLi8oMTI2MC4qbipuKm4qbipuKSk7CiAgICB9Cn0KCmRvdWJsZSBzZXJpZXMoZG91YmxlIHgsIGRvdWJsZSBlcHMpCnsKICAgIGRvdWJsZSBzdW0gPSAxLCBhID0gMSwgeiA9IDE7CiAgICBmb3IoaW50IG4gPSAxOyBhYnMoeikgPiBlcHM7ICsrbikKICAgIHsKICAgICAgICBhID0gLWEgKiAyKngqeC9uLygyKm4tMSk7CiAgICAgICAgeiA9IGEgKiBiZXJub3VsbGkoMipuKTsKICAgICAgICBzdW0gKz0gejsKICAgIH0KICAgIHJldHVybiBzdW0veDsKfQoKaW50IG1haW4oKQp7CgogICAgZm9yKGRvdWJsZSB4ID0gLTMuMTsgeCA8IDMuMTE7IHggKz0gMC4wNSkKICAgIHsKICAgICAgICBkb3VibGUgeSA9IHNlcmllcyh4LDFlLTkpOwogICAgICAgIGNvdXQKICAgICAgICAgICAgPDwgc2V0dyg1KSA8PCB4IDw8IHNldHcoMTApIDw8IDEvdGFuKHgpCiAgICAgICAgICAgIDw8IHNldHcoMTApIDw8IHkgPDwgZW5kbDsKICAgIH0KfQo=