牛客小白月賽14B-投硬幣【機率】

你在練習 dp,你每一次會有 p 的機率成功,1-p 的機率失敗
求投 n 次後,至少有 k 次成功的機率ios

答案模 998244353,其中 0≤k,n≤105,0≤p<9982443530≤k,n≤105,0≤p<998244353spa

實際上給你的這個機率是在模 998244353 意義下的,換句說 p≡ab(mod998244353)p≡ab(mod998244353)code

輸入描述:

第一行三個整數 n,k,p

輸出描述:

一行一個整數表示答案對 998244353 取模的結果

思路:二項分佈,即n重伯努利實驗,公式P=C(X,n)*π^X*(1-π)^(n-X),而後利用組合數求一下就好了。ci

#include<set>
#include<map>
#include<cmath>
#include<cstdio>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
const int maxn = 3e6 + 10;
ll a[maxn];
ll n, k, p;
ll powermod(ll a, ll b, ll c)
{
    ll ans = 1;
    a = a % c;
    while(b)
    {
        if(b&1)
            ans = ans * a % c;
        b >>= 1;
        a = a * a % c;
    }
    return ans % c;
}

void init()
{
    a[0] = 1;
    for(ll i = 1; i <= maxn; ++i)
        a[i] = a[i - 1] * i % mod;
}
//n 和 m 較小,P較大
ll C(ll n,ll m)
{
    if(n < m)
        return 0;
    ll ans = 1;
    ans = ans * a[n] % mod;
    ans = ans * powermod(a[m], mod - 2, mod) % mod;
    ans = ans * powermod(a[n - m], mod - 2, mod) % mod;
    return ans;
}

int main()
{
    init();
    cin >> n >> k >> p;
    ll ans = 0;
    for(ll i = k; i <= n; ++i)
        ans = (ans + C(n, i) * powermod(p, i, mod) % mod * powermod(1 - p + mod, n - i, mod) % mod) % mod;
    cout << ans << endl;
    return 0;
}