数学几何题
构造指定一条边x的整数直角三角形
这里有欧几里得三原组公式(即直角三角形三题边,如果是整数一定能表示成以下形式其中\(gcd(n,m) = 1, n>m\)并且 n,m满足一个奇数一个偶数):
\[a = 2mn, b = n^2 +m^2, c = n^2 - m^2 = (n + m)(n - m)
\]
我们现有一个数x,那么分类讨论一下其构造,如下
- x为奇数,这种情况下我们令c = x,构造令\(n - m = 1,n + m = x\)表示出\(n = (x -1) / 2,m = (x + 1)/2\),即可构造出a与b
- x为偶数,当\(4 \le x\)在这种情况下我们看\(a=2nm = x\)令\(n = 1,m = x/ 2\),最终也可以写出对应a ,b ,c的表达式
代码如下
#include <iostream>
#define ll long long
using namespace std;
//
//欧几里得公式:a=m^2 - n^2, b = 2nm, c = m^2 + n^2;
//n,m为互质的奇数和偶数
void solve()
{
ll x,m,n;cin >> x;
if(x == 1 || x == 2)
{
cout << "No\n";
return;
}
cout << "Yes\n";
cout << x << ' ';
if(x&1)
{
n = (x - 1) / 2, m = (x + 1) / 2;
cout << 2 * m * n << " " << m * m + n * n << '\n';
}
else cout << 1 + (x / 2) * (x / 2) << " " << abs(1 - (x / 2) * (x / 2))<< '\n';
}
int main()
{
int _;cin >> _;
while(_--) solve();
}
[算两个圆并集的总面积]
算两个圆覆盖的总面积。
面积即为中间几何体 + 两边扇形面积
如下
扇形面积即为:
\[S_{\text{几何体}} = \frac{1}{2} \sqrt{(-d+r_1+r_2)(d+r_1-r_2)(d-r_1+r_2)(d+r_1+r_2)}.
\]
其中根号部分可由海伦公式得到
\[p = \frac{d + r_1 + r_2}{2},
\]
三角形面积(几何体由两个三角形组合而成)
\[S_{\triangle} = \sqrt{p(p-d)(p-r_1)(p-r_2)} = \frac{1}{4}\sqrt{(d+r_1+r_2)(-d+r_1+r_2)(d-r_1+r_2)(d+r_1-r_2)}.
\]
因此,
\[\sqrt{(-d+r_1+r_2)(d+r_1-r_2)(d-r_1+r_2)(d+r_1+r_2)} = 4 S_{\triangle}.
\]
设两圆圆心距为\(d\),半径分别为 \(r_1\) 和 \(r_2\)(不妨设 \(r_1 \ge r_2\)),且两圆相交(\((|r_1 - r_2| < d < r_1 + r_2\))。则相交部分面积为:
\[S_{\text{双扇形面积}} = r_1^2 (π -\arccos\left(\frac{d^2 + r_1^2 - r_2^2}{2 d r_1}\right)) + r_2^2 (π - \arccos\left(\frac{d^2 + r_2^2 - r_1^2}{2 d r_2}\right))
\]
最终答案即为
\[\begin{aligned}
res &= S_{\text{双扇形面积}} + S_{\text{几何体}} \\
&= r_1^2 \left( \pi - \arccos\left(\frac{d^2 + r_1^2 - r_2^2}{2 d r_1}\right) \right) \\
&\quad + r_2^2 \left( \pi - \arccos\left(\frac{d^2 + r_2^2 - r_1^2}{2 d r_2}\right) \right) \\
&\quad + \frac{1}{2} \sqrt{(-d+r_1+r_2)(d+r_1-r_2)(d-r_1+r_2)(d+r_1+r_2)}.
\end{aligned}
\]
#include <bits/stdc++.h>
using namespace std;
typedef pair<double , double>pii;
struct c//circle
{
double r;//半径
pii pt;//point
};
double pi = acos(-1);
void input(c &qwq)
{
cin >> qwq.pt.first >> qwq.pt.second >> qwq.r;
}
void solve()
{
c c1, c2;
int n;cin >> n;
if(n == 1)
{
input(c1);
cout << fixed << setprecision(4) << c1.r * c1.r * pi << '\n';
}
else
{
input(c1),input(c2);
double dis = sqrt((c1.pt.first - c2.pt.first) * (c1.pt.first - c2.pt.first) + (c1.pt.second - c2.pt.second)*(c1.pt.second - c2.pt.second));
if(c1.r < c2.r) swap(c1,c2);
if(dis >= c1.r + c2.r) cout << fixed << setprecision(4) << c1.r * c1.r * pi + c2.r * c2.r * pi << '\n';
else if(dis + c2.r <= c1.r) cout << fixed << setprecision(4) << c1.r * c1.r * pi << '\n';
else
{
//如果是钝角的情况呢,那么在这种情况下我们arcos函数是不是就不适用了?
//不会出现因为,因为我们计算角度的时候直接用的是dis/r这种算法所以算出来默认是锐角的那一边(注意显然这两个角,要么同时锐角,要么同时钝角)
double r1 = c1.r, r2 = c2.r;
double d = dis;
double angle1 = acos((d*d + r1*r1 - r2*r2) / (2*d*r1));//dis1/r1
double angle2 = acos((d*d + r2*r2 - r1*r1) / (2* d*r2));//dis2/r2
//现在已经知道三条边求面积,直接套一下海伦公式
//p = (a + b + c) /2,s = sqrt(p * (p - a) *(p - b) *(p - c));
double res = (pi - angle1) * r1*r1 + (pi - angle1) *r2*r2 + sqrt((-d+r1+r2)*(d+r1-r2)*(d-r1+r2)*(d+r1+r2))/2;//扇形+ 中间几何形状
cout << fixed << setprecision(4) << res << '\n';
}
}
}
int main()
{
int t;cin >> t;
while(t -- )solve();
return 0;
}

浙公网安备 33010602011771号