投硬币

https://ac.nowcoder.com/acm/contest/879/B

链接:https://ac.nowcoder.com/acm/contest/879/B
来源:牛客网

你在练习 dp,你每一次会有 p 的概率成功,1-p 的概率失败
求投 n 次后,至少有 k 次成功的概率
答案模 998244353,其中 0≤k,n≤105,0≤p<9982443530 le k,n le 10^5,0 le p < 9982443530k,n105,0p<998244353
实际上给你的这个概率是在模 998244353 意义下的,换句说 p≡ab(mod998244353)p equiv frac{a}{b} pmod {998244353}pba(mod998244353)

输入描述:

第一行三个整数 n,k,p

输出描述:

一行一个整数表示答案对 998244353 取模的结果
示例1

输入

复制
34 21 56

输出

复制
345738771
题解: 从k到n,逐个枚举,计算公式为C(n,i)*p^i*(1-p)^(n-i);(C是组合数);
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1E5+7;
const int mod=998244353;
ll ksm(ll x,  ll y){
    ll res=1;
    while(y){
        if(y&1) res=res*x%mod;
        x=x*x%mod;
        y>>=1;
    }
    return res%mod;
}
ll c(ll n,ll m){
    if(m>n)return 0;
    ll a=1,b=1;
    for(int i=1;i<=m;i++){
        a=a*(n+i-m)%mod;
        b=b*i%mod;
    }
    return a*ksm(b,mod-2)%mod;
}
int main(){
    int n,m,k;
    cin>>n>>m>>k;
    ll ans=0;
    ll temp= c(n,m); 
    for(int i=m;i<=n;i++){
        ans=(ans%mod+(temp%mod*ksm(k,i)%mod*ksm(1-k,n-i)%mod)%mod) %mod;
        temp = (((temp * (n-i))%mod)*ksm(i+1, mod-2))%mod; 
    }
    cout<<(ans+mod)%mod<<endl;
    return 0;
}



原文地址:https://www.cnblogs.com/Accepting/p/11447295.html