题意
给出一个整数\(a\),给出两个抛物线\(y = (x - a) ^ 2\)和\(x = (y - a) ^ 2\)。
求两个曲线围成的面积。
\(1 \leq a \leq {10} ^ {18}\)。
题解
开始感觉就是一道积分题。
显然该函数图像可以分三段来积分。
然后写了个shit长的牛迭+积分。
然后发现它不仅爆精了,还T了。
诶,等等……这个\(a\)为什么是整数啊?
若干秒后——
tm这竟然是找规律题……
输出\(a\),输出\(\frac{12a - 1}{3}\)……
但是这对于实数不应该也成立吗?
原因很简单,\(a\)是整数时答案的形式都是\(x.6666666667\),直接算反而要爆精……
#include <bits/stdc++.h>
using namespace std;
long long a, b;
int main () {
cin >> a;
b = a * 4 - 1;
cout << b << ".6666666667" << endl;
return 0;
}
另附长长的暴力……
#include <bits/stdc++.h>
using namespace std;
typedef double db;
// y1 = (x - a) ^ 2
// y2 = \sqrt x - a
// y3 = a - \sqrt x
const db eps = 1e-14, inf = 2e18;
db a, x1, x2, x3, x4, ans;
db sqr (db x) {
return x * x;
}
db cub (db x) {
return x * x * x;
}
db f1 (db x) {
return sqr(x - a) - sqrt(x) - a;
}
db d_f1 (db x) {
return (x - a) * 2 - sqrt(x) / 2;
}
db f2 (db x) {
return sqr(x - a) + sqrt(x) - a;
}
db d_f2 (db x) {
return (x - a) * 2 + sqrt(x) / 2;
}
db f3 (db x) {
return sqr(x - a) + sqrt(x) - a;
}
db d_f3 (db x) {
return (x - a) * 2 + sqrt(x) / 2;
}
db f4 (db x) {
return sqr(x - a) - sqrt(x) - a;
}
db d_f4 (db x) {
return (x - a) * 2 - sqrt(x) / 2;
}
db newton_f1 (db x) {
db x0 = x + 1;
for ( ; fabs(x - x0) > eps; ) {
x0 = x, x = x0 - f1(x0) / d_f1(x0);
}
return x;
}
db newton_f2 (db x) {
db x0 = x + 1;
for ( ; fabs(x - x0) > eps; ) {
x0 = x, x = x0 - f2(x0) / d_f2(x0);
}
return x;
}
db newton_f3 (db x) {
db x0 = x + 1;
for ( ; fabs(x - x0) > eps; ) {
x0 = x, x = x0 - f3(x0) / d_f3(x0);
}
return x;
}
db newton_f4 (db x) {
db x0 = x + 1;
for ( ; fabs(x - x0) > eps; ) {
x0 = x, x = x0 - f4(x0) / d_f4(x0);
}
return x;
}
db i_f12 (db x) {
return -cub(x) / 3 + a * sqr(x) + 2.0 / 3 * pow(x, 1.5) + a * x - sqr(a) * x;
}
db i_f12 (db l, db r) {
return i_f12(r) - i_f12(l);
}
db i_f23 (db x) {
return 4.0 / 3 * pow(x, 1.5);
}
db i_f23 (db l, db r) {
return i_f23(r) - i_f23(l);
}
db i_f34 (db x) {
return -cub(x) / 3 + a * sqr(x) + 2.0 / 3 * pow(x, 1.5) + a * x - sqr(a) * x;
}
db i_f34 (db l, db r) {
return i_f34(r) - i_f34(l);
}
int main () {
cin >> a;
x1 = newton_f1(0);
x2 = newton_f2(0);
x3 = newton_f3(a * 2);
x4 = newton_f4(a * 2);
ans = i_f12(x1, x2) + i_f23(x2, x3) + i_f34(x3, x4);
cout << fixed << setprecision(10) << ans << endl;
return 0;
}