hdu 6814 Tetrahedron 规律+排列组合逆元

题意:

给你一个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;
}

 

posted @ 2020-08-05 17:32  kongbursi  阅读(111)  评论(0编辑  收藏  举报