zoukankan      html  css  js  c++  java
  • 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
    ",(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
    ",(ksc(dp[n],ppow(n,mod-2)))%mod);
        }
        return 0;
    }
  • 相关阅读:
    C# bool? 逻辑运算
    C# yield return 用法与解析
    枚举器和迭代器
    C# 事件
    C# 索引器
    C# 实现单例模式的几种方法
    协变 和 逆变
    C# 结构体的特点
    装箱 和 拆箱
    继承之---对象用父类声明,用子类实例化
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13441376.html
Copyright © 2011-2022 走看看