Tetrahedron
题意:看图就行。
首先很关键的是对那个1/h^2的转化。
思路一:等积法,高中的求法。因为是上面是三个直角所以可以把体积求出,下面三条边也可以求出,那么底面积也可以求出,那么高h也可以得到。
但是这样就得到了比较麻烦的一个高次多项的式子,就要像题解那样考虑来考虑去,很麻烦。
思路二:向量叉积,将利用三个向量夹角为90度和等积法来转化。
即可得到$\frac{1}{h^2} = \frac{1}{a^2}+\frac{1}{b^2}+\frac{1}{c^2}$
由公式$E[x+y] = E[x] + E[y]$可得$E[\frac{1}{h^2}] = E[\frac{1}{a^2}]+E[\frac{1}{b^2}]+E[\frac{1}{c^2}]$
可以发现a,b,c都是[1,n]。
那么每一位置的概率都是1/n,所以期望就是$3* \sum_{i = 1}^{n} \frac{1}{i^2} * \frac{1}{n}$
那么可以先预处理出$ \frac{1}{i^2}$的逆元前缀和,然后最后乘上1/n和3即可。
坑点,注意的是i*i过大,预处理的时候会爆longlong,所以要先对a取模。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef long double ld; typedef pair<LL,int> pii; const int N = 6e6+5; const int M = 1e6+5; const LL Mod = 998244353; #define rg register #define pi acos(-1) #define INF 1e9 #define INM INT_MIN #define dbg(ax) cout << "now this num is " << ax << endl; inline int read() { int x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} return x*f; } LL sum[N]; LL quick_mi(LL a,LL b) { LL re = 1; a %= Mod;//先取模 while(b) { if(b&1) re = re*a%Mod; a = a*a%Mod; b >>= 1; } return re; } void init() { for(int i = 1;i < N;++i) { LL ma = quick_mi(1LL*i*i,Mod-2); sum[i] = (sum[i-1]+ma)%Mod; } } int main() { init(); int ca;ca = read(); while(ca--) { int n;n = read(); LL ans = (sum[n]*quick_mi(n,Mod-2))%Mod*3%Mod; printf("%lld\n",ans); } system("pause"); return 0; }