HDU6814(数学期望,分数取模)

传送门
HDU6814(数学期望,分数取模)_第1张图片题意:已知直角四面体三个直角边长,求E(1/h^2)

看了官方题解的高端解法,我比赛时就用的很朴素的高中做法:等体积法,把1/h^2表示出来

E(1/h^2)=3E(1/a平方)
超了好几次,最后将我总结的点分享出来
1、尽量少开ll容易超时
2、intll容易爆,llint不用担心
3、做数学题要稳住,别推错了2333

上代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int mod = 998244353;
ll fastpow(ll base, ll n, ll mod) {
    ll ans = 1;
    while (n) {
        if (n & 1) ans *= base % mod, ans %= mod;
        base *= base, base %= mod;
        n >>= 1;
    }
    return ans % mod;
}

int T;
int n;
int sum[6000005];
int main()
{
    scanf("%d", &T);
    for (ll i = 1; i <= 6e6; i++)
	{
	
        sum[i] = (sum[i - 1] + fastpow(i * i%mod, mod - 2, mod))%mod;
	}
    while (T--)
    {
    
        scanf("%d", &n);
        printf("%lld\n", 3ll * sum[n] * fastpow(n, mod - 2, mod) % mod);//longlong费时尽量别新定义一个
        //cout << 3ll * sum[n] * fastpow(n, mod - 2, mod) % mod << endl;
    }
}

你可能感兴趣的:(数学)