通过数学原理推公式 ,可得:
有k次成功的概率为:C(n,k) * p^k * (1-p)^(n-k)
有k+1次成功的概率为:C(n,k+1) * p^(k+1) * (1-p)^(n-k-1)
……
有n次成功的概率为:C(n,n) * p^n * (1-p)^0
这里我们很容易推出每一种情况的公式:
C(n,i) * p^i * (1-p)^(n-i)
然后将 k — n 的每一项加起来,求得
#include<bits/stdc++.h> using namespace std; #define maxn 300005 #define ll long long const ll mod = 998244353; ll n,k,p,sum; ll pri[maxn],ni[maxn]; ll poww(ll a,ll b){ ll ans=1,base=a; while(b!=0){ if(b&1!=0)ans=(ans*base)%mod; base=(base*base)%mod; b>>=1; } return ans%mod; } void s(){ pri[0]=ni[0]=1; for(int i=1;i<=n;i++){ pri[i]=pri[i-1]*i%mod; ni[i]=poww(pri[i],mod-2); } } int main() { scanf("%lld %lld %lld",&n,&k,&p); s(); for(int i=k;i<=n;i++){ sum+=pri[n]*ni[n-i]%mod*ni[i]%mod*poww(p,i)%mod*poww((1-p+mod)%mod,n-i)%mod; sum%=mod; } printf("%lld",sum); return 0; }