你在練習 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; }