数学几何题

构造指定一条边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();  
}

[算两个圆并集的总面积]

算两个圆覆盖的总面积。
面积即为中间几何体 + 两边扇形面积
如下pic
扇形面积即为:

\[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;	
} 
posted @ 2026-04-23 20:00  Mikan_QWQ  阅读(3)  评论(0)    收藏  举报