HDU6814杭州電力学校の第5四面体(実際には、2つの式、超単純なバージョンしかありません)

題名:

3つの面は直角の三角錐であり、3つのエッジの長さはa、b、ca、b、cです。A b c[1、n] [1、n][ 1 n ]どちらを選択しても)。頂点から底までの距離をhhとします。h、求1 h 2 \ frac {1} {h ^ 2}h21期待。

分析:

派生の公式説明は面倒すぎると思うので、このブログを書いて自分の派生について話しました。

三角錐の3つの角度はすべて直角であるため、頂点を座標の原点と見なし、3つのエッジを3つの方向の軸と見なします。hhhの解は、点から表面までの距離に変換されます。
ここに画像の説明を挿入

3次元直交座標系の中点(x 0、y 0、z 0)(x_0、y_0、z_0)x0そして0から0到面A x + B y + C z + D = 0 Ax + By + Cz + D = 0X+B y+C z+D=0距離の式:
h = ∣ A x 0 + B y 0 + C z 0 + D ∣ A 2 + B 2 + C 2 h = \ frac {| Ax_0 + By_0 + Cz_0 + D |} {\ sqrt {A ^ 2 + B ^ 2 + C ^ 2}}h=A2+B2+C2 | AのX0+B y0+C z0+D |
一番下はパス(0、0、a)、(b、0、0)、(0、c、0)(0,0、a)、(b、0,0)、(0、c、0 )0 0 a b 0 0 0 c 0 、表面の式を計算する必要はありません
ac x + ab y + bc z − abc = 0 ac \ x + ab \ y + bc \ z-abc = 0a c x +a b y +b c z a b c=0
頂点は座標の原点であり、式
h = abca 2 b 2 + b 2 c 2 + a 2 c 2 h = \ frac {abc} {a ^ 2b ^ 2 + b ^ 2c ^ 2 + a ^ 2c ^ 2}h=a2 b2+b2 c2+a2 c2bはC
那么1h2
= 1 a 2 + 1 b 2 + 1 c 2 \ frac {1} {h ^ 2} = \ frac {1} {a ^ 2} + \ frac {1} {b ^ 2} + \ frac {1} {c ^ 2}h21=a21+b21+c21
a、b、ca、b、c A b c等价、E(1 h 2)= 3×E(1 a 2)E(\ frac {1} {h ^ 2})= 3 \ times E(\ frac {1} {a ^ 2})E h21)。=3××E a21)。

下の逆元を線形に見つけて、接頭辞を合計します。最終出力の確率で除算することを忘れないでください。pre[n]×inv [n]%mod pre [n] \ times inv [n] \%モッドp r e [ n ]××i n v [ n ] m o d

ACコード:

#include<cstdio>
#include <cmath>
#define pb push_back 
#define fir first
#define sec second
#define ms(a,b) memset(a,b,sizeof(a)) 
#define INF 0x3f3f3f3f
#define sp system("pause")
#define multi int T;scanf("%d",&T);while(T--) 
using namespace std;
typedef long long ll;
typedef double db;
const int N=6e6+5;
const ll mod=998244353;
const db pi=acos(-1.0);
ll inv[N],pre[N];
ll qpow(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
void invv(int n,int p)//1~n在模p意义下逆元
{
    inv[0]=inv[1]=1;
    for(int i=2;i<=n;i++)
        inv[i]=((-p/i*inv[p%i])%p+p)%p;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("D:\\work\\data.in","r",stdin);
    #endif
    invv(6e6,mod);
    for(ll i=1;i<=6e6;i++){
        pre[i]=(pre[i-1]+3*inv[i]*inv[i])%mod;
    } 
    multi{
        int n;
        scanf("%d",&n);
        printf("%lld\n",pre[n]*inv[n]%mod);
    }
}

おすすめ

転載: blog.csdn.net/Luowaterbi/article/details/107818357