[ural 2121]. Intersection of Parabolas

题意

给出一个整数\(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;
}
posted @ 2019-11-05 19:45  psimonw  阅读(172)  评论(0编辑  收藏  举报