HDU1411求四面体体积

欧拉体积公式:

/***************************************************
 方法一:
 欧拉体积公式用行列式求,见上图;
 ***************************************************/

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;

double p,q,r,m,n,l;
double v[3][3];

double det_cal()//行列式计算
{
    double v1=v[0][0]*v[1][1]*v[2][2];
    double v2=v[0][1]*v[1][2]*v[2][0];
    double v3=v[1][0]*v[2][1]*v[0][2];
    double v4=v[0][1]*v[1][0]*v[2][2];
    double v5=v[2][0]*v[1][1]*v[0][2];
    double v6=v[0][0]*v[2][1]*v[1][2];
    
    return (v1+v2+v3)-(v4+v5+v6);
}

int main()
{
    double vs;//体积平方
    
    while(cin>>p>>q>>r>>n>>m>>l)
    {
        v[0][0]=p*p;//对行列式赋值
        v[0][1]=v[1][0]=(p*p+q*q-n*n)/2;
        v[0][2]=v[2][0]=(p*p+r*r-m*m)/2;
        v[1][1]=q*q;
        v[1][2]=v[2][1]=(q*q+r*r-l*l)/2;
        v[2][2]=r*r;
        vs=det_cal();
        printf("%.4lf\n",sqrt(vs/36));
    }
    return 0;
}

/******************************************************
方法二:
四面体ABCD中:
AD=a, AB=c, AC=b,;
∠CAD=∠ga, ∠CAB=∠gb, ∠DAB=∠gc;
∠gw=(∠ga+∠gb+∠gc)/2;
则体积公式为:
V=sqrt(sin∠gw*sin∠(gw-ga)*sin∠(gw-gb)*sin∠(gw-gc))*a*b*c/3;
*******************************************************/

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
double angle(double AB, double AC, double BC)//triangle ABC 的angleA, rad//求角度
{
    return acos((AC*AC+AB*AB-BC*BC)/(2*AB*AC));
}
int main()
{
    double ab, ac, ad, bc, bd, cd;
    double a, b, c, ga, gb, gc, gw;
    
    while(~scanf("%lf%lf%lf%lf%lf%lf", &ab, &ac, &ad, &bc, &bd, &cd))
    {
        a=ad;
        b=ac;
        c=ab;
        ga=angle(ac, ad, cd);
        gb=angle(ac, ab, bc);
        gc=angle(ad, ab, bd);
        gw=(ga+gb+gc)/2;
        
        printf("%.4lf\n", sqrt(sin(gw)*sin(gw-ga)*sin(gw-gb)*sin(gw-gc))*a*b*c/3);
    }
    return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 HDU4992 所有原根的问题,我可以给出以下解答: 1. 首先,我们需要知道什么是原根。原根是指模 n 意义下,所有与 n 互质的数 a 的最小正整数 k 次幂对 n 取模的值覆盖了所有与 n 互质的数。简单来说,就是如果一个数 a 是模 n 意义下的原根,那么 a 的任何正整数次幂对 n 取模的值都不相同,且能覆盖所有与 n 互质的数。 2. 为了模 n 意义下的所有原根,我们需要先出与 n 互质的数的个数 phi(n)。phi(n) 可以使用欧拉函数出。 3. 然后,我们需要枚举模 n 意义下的所有数,判断它是否是原根。具体来说,对于每个 a,我们需要判断 a 的每个小于 phi(n) 的正整数次幂对 n 取模的值是否都不相同,且能覆盖所有与 n 互质的数。如果是,那么 a 就是模 n 意义下的原根。 4. 代码实现可以参考以下 Java 代码: ``` import java.util.*; public class Main { static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } static int phi(int n) { int res = n; for (int i = 2; i * i <= n; i++) { if (n % i == 0) { res = res / i * (i - 1); while (n % i == 0) { n /= i; } } } if (n > 1) { res = res / n * (n - 1); } return res; } static int pow(int a, int b, int mod) { int res = 1; while (b > 0) { if ((b & 1) != 0) { res = res * a % mod; } a = a * a % mod; b >>= 1; } return res; } static boolean check(int a, int n, int phi) { for (int i = 1, j = pow(a, i, n); i <= phi; i++, j = j * a % n) { if (j == 1) { return false; } } return true; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); int phi = phi(n); List<Integer> ans = new ArrayList<>(); for (int i = 1; i < n; i++) { if (gcd(i, n) == 1 && check(i, n, phi)) { ans.add(i); } } Collections.sort(ans); for (int x : ans) { System.out.print(x + " "); } System.out.println(); } } } ``` 其中,gcd 函数用于最大公约数,phi 函数用于欧拉函数,pow 函数用于快速幂模,check 函数用于判断一个数是否是原根。在主函数中,我们依次读入每个 n,出 phi(n),然后枚举模 n 意义下的所有数,判断它是否是原根,将所有原根存入一个 List 中,最后排序输出即可。 希望我的回答能够帮到你,如果你有任何问题,欢迎随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值