【2020牛客多校一:数学积分】J :Easy Integration

传送门

【难度】
4/10
数学题/或找规律题

【题意】

求出 I n I_n In
其中 I n = ∫ 0 1 ( x − x 2 ) n   d x \pmb{I_n=\int_0^1(x-x^2)^n\,dx} In=01(xx2)ndxIn=01(xx2)ndxIn=01(xx2)ndx

【数据范围】

T组样例
T ≤ 1 e 5 T\le1e5 T1e5
n ≤ 1 e 6 n\le1e6 n1e6

【输入样例】

1
2
3

【输出样例】

166374059
432572553
591816295

【解释】

I 1 = ∫ 0 1 ( x − x 2 )   d x = 1 6 \pmb{I_1=\int_0^1(x-x^2)\,dx=\frac{1}{6}} I1=01(xx2)dx=61I1=01(xx2)dx=61I1=01(xx2)dx=61

【思路】

据说是wallis integral ,但是看了公式页许久也不知道为什么

我们利用分部积分做。
即:
∫ a b u v ′   d x = u v ∣ a b ∫ a b u ′ v d x \int_a^buv'\,dx=uv\Big |_a^b \int_a^bu'vdx abuvdx=uvababuvdx
接下来先化简公式再进行运算:
I n = ∫ 0 1 ( x − x 2 ) n   d x = ∫ 0 1 x n ( 1 − x ) n   d x = 1 n + 1 x n + 1 ( 1 − x ) n ∣ 0 1   + ∫ 0 1 n ( 1 − x ) n − 1 1 n + 1 x n + 1   d x = ∫ 0 1 n ( 1 − x ) n − 1 1 n + 1 x n + 1   d x ( 左 边 项 为 0 ) ⋮ ( n 次 分 部 积 分 后 )   I n = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ⋯ ∗ 2 ∗ 1 ( n + 1 ) ∗ ( n + 2 ) ∗ ⋯ ∗ ( 2 n ) ∫ 0 1 ( 1 − x ) 0 x 2 n   d x = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ⋯ ∗ 2 ∗ 1 ( n + 1 ) ∗ ( n + 2 ) ∗ ⋯ ∗ ( 2 n ) 1 2 n + 1 x 2 n + 1 ∣ 0 1 = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ⋯ ∗ 2 ∗ 1 ( n + 1 ) ∗ ( n + 2 ) ∗ ⋯ ∗ ( 2 n + 1 ) = ( n ! ) 2 ( 2 n + 1 ) ! \begin{aligned} I_n&=\int_0^1(x-x^2)^n\,dx\\ &=\int_0^1x^n(1-x)^n\,dx\\ &=\frac{1}{n+1}x^{n+1}(1-x)^{n}\Bigg |_0^1 \ +\int_0^1n(1-x)^{n-1}\frac{1}{n+1}x^{n+1}\,dx\\ &=\int_0^1n(1-x)^{n-1}\frac{1}{n+1}x^{n+1}\,dx \qquad (左边项为0)\\ \end{aligned}\\ \vdots\qquad(n次分部积分后)\\ \ \\ \begin{aligned} I_n &= \frac{n*(n-1)*(n-2)*\cdots*2*1}{(n+1)*(n+2)*\cdots*(2n)}\int_0^1(1-x)^0x^{2n}\,dx\\ &= \frac{n*(n-1)*(n-2)*\cdots*2*1}{(n+1)*(n+2)*\cdots*(2n)}\frac{1}{2n+1}x^{2n+1}\Bigg |_0^1 \\ &= \frac{n*(n-1)*(n-2)*\cdots*2*1}{(n+1)*(n+2)*\cdots*(2n+1)}\\ &=\frac{(n!)^2}{(2n+1)!} \end{aligned} In=01(xx2)ndx=01xn(1x)ndx=n+11xn+1(1x)n01 +01n(1x)n1n+11xn+1dx=01n(1x)n1n+11xn+1dx0(n) In=(n+1)(n+2)(2n)n(n1)(n2)2101(1x)0x2ndx=(n+1)(n+2)(2n)n(n1)(n2)212n+11x2n+101=(n+1)(n+2)(2n+1)n(n1)(n2)21=(2n+1)!(n!)2

接下来我们只要先预处理出阶乘数组与阶乘逆元数组

【核心代码】

/*
 _            __   __          _          _
| |           \ \ / /         | |        (_)
| |__  _   _   \ V /__ _ _ __ | |     ___ _
| '_ \| | | |   \ // _` | '_ \| |    / _ \ |
| |_) | |_| |   | | (_| | | | | |___|  __/ |
|_.__/ \__, |   \_/\__,_|_| |_\_____/\___|_|
        __/ |
       |___/
*/
const int MAX = 2e6+50;
const ll  MOD = 998244353;

ll qpow(ll a,ll n){/* */ll res = 1LL;while(n){if(n&1)res=res*a%MOD;a=a*a%MOD;n>>=1;}return res;}
ll qpow(ll a,ll n,ll p){ll res = 1LL;while(n){if(n&1)res=res*a%p;a=a*a%p;n>>=1;/**/}return res;}
ll inv(ll a){/* */return qpow(a,MOD-2);}
ll inv(ll a,ll p){return qpow(a,p-2,p);}

ll fac[MAX];
ll inv_fac[MAX];
void init(int n){
    fac[0]=1LL;
    for(int i=1;i<=n;++i){
        fac[i]=(fac[i-1]*i)%MOD;
    }
    inv_fac[n]=inv(fac[n]);
    for(int i=n-1;i>=1;--i){
        inv_fac[i]=(inv_fac[i+1]*(i+1))%MOD;
    }
}
int main()
{
    init(MAX-50);
    ll n;
    while(cin >> n){
        cout << (fac[n]*fac[n])%MOD*inv_fac[2*n+1]%MOD << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值