J 高数签到题

思路

$\int_0^1(x-x^2)^ndx$ $=\int_0^1(\frac{1}{4}-(x-\frac{1}{2})^2)^ndx$ $=\frac{1}{4^n}\int_0^1(1-(2x-1)^2)^ndx$

令 $sin(t)=2x-1$,有$cos(t)dt=2dx$,换元得

$=\frac{1}{4^n}\int_{-\frac{\pi}{2}}^{\frac{\pi}{2}}(1-sin^2(t))^n\frac{cos(t)}{2}dt$ $=\frac{1}{4^n}\int_{0}^{\frac{\pi}{2}}cos^{2n+1}(t)dt$

由华莱士公式:

\[\int_0^{\frac{\pi}{2}}cos^n(x)dx=\left\{ \begin{aligned} \frac{(2k-1)!!}{(2k)!!}\frac{\pi}{2} && n=2k \\ \frac{(2k)!!}{(2k+1)!!} && n=2k+1 \\ \end{aligned} \right.\]

于是: $\int_0^1(x-x^2)^ndx$ $=\frac{1}{4^n}\cdot\frac{(2n)!!}{(2n+1)!!}$ $=\frac{(n!)^2}{(2n+1)!}$

代码

#include <iostream>
using namespace std;
using ll = long long;

const ll MOD = 998244353;
const int N = 2e6 + 5;

ll fac[N];

ll quick_pow(ll a, ll b) {
    ll ret = 1;
    while(b) {
        if (b & 1) ret = ret * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return ret;
}

ll divm(ll x, ll y) {
    return x % MOD * quick_pow(y, MOD - 2) % MOD;
}

ll init() {
    fac[0] = 1;
    for (int i = 1; i < N; ++i) 
        fac[i] = fac[i - 1] * i % MOD;
}

int main() {
    int n;
    init();
    while(cin >> n) {
        cout << divm(fac[n] * fac[n], fac[2 * n + 1])<< endl;
    }
    return 0;
}