hdu 6814 Tetrahedron 規律+排列組合逆元
阿新 • • 發佈:2020-08-05
題意:
給你一個n,你需要從1到n(閉區間)中選出來三個數a,b,c(可以a=b=c),用它們構成一個直角四面體的三條稜(可看圖),問你從D點到下面的三角形做一條垂線h,問你1/h2的期望
題解:
那麼1/h2=1/a2+1/b2+1/c2
總數就是n3
之後就是找分子怎麼求,規律:
((1/a1*a1)*n*n+(1/a2*a2)*n*n+(1/an*an)*n*n)/(n*n*n)a的取值從1到n
程式碼:
#include<stack> #include<queue> #include<map> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define fi first #define se second using namespace std; typedef long long ll; const int maxn=6e6+1; const int mod=998244353; ll dp[maxn]; ll ksc(ll a, ll b) { ll ans = 0; while( b > 0 ) { if( b&1 ) ans = (ans + a) % mod; a= ( a + a ) % mod; b >>= 1; } return ans; } ll ppow(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; a=(a*a)%mod; b>>=1; } return ans; } int main() { //printf("%d\n",(15*ppow(8,mod-2))%mod); ll ans = 0; for(ll i = 1; i <= 6000001; i++) { ll x = ((i * i) % mod); ans = (ans + (ppow(x, mod - 2) % mod)); dp[i] = (ans * 3) % mod; } ll t; scanf("%lld",&t); while(t--) { ll n; scanf("%lld",&n); printf("%lld\n",(ksc(dp[n],ppow(n,mod-2)))%mod); } return 0; }