算概率(概率DP)

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

题目描述

牛牛刚刚考完了期末,尽管 牛牛 做答了所有 n\text{}nn 道题目,但他不知道有多少题是正确的。
不过,牛牛 知道第 i\text{}ii 道题的正确率是 pip_ipi​。
牛牛 想知道这 n 题里恰好有 0,1,…,n0,1,\dots,n0,1,…,n 题正确的概率分别是多少,对 109+710^9+7109+7 取模。
对 109+710^9+7109+7 取模的含义是:对于一个 b≠0b\neq 0b​=0 的不可约分数 aba\over bba​,存在 q\text{}qq 使得 b×q mod (109+7)=ab\times q \bmod (10^9+7) =ab×qmod(109+7)=a,q\text{}qq 即为 aba\over bba​ 对 109+710^9+7109+7 取模的结果。

输入描述:

第一行,一个正整数 n\text{}nn 。
第二行,n\text{}nn 个整数 p1,p2,…,pnp_1,p_2,\dots,p_np1​,p2​,…,pn​,在模 109+710^9+7109+7 意义下给出。
保证 1≤n≤20001\leq n\leq 20001≤n≤2000。

输出描述:

输出一行 n+1\text{}n+1n+1 个用空格隔开的整数表示答案(对 109+710^9+7109+7 取模)。

示例1

输入

复制1 500000004

1
500000004

输出

复制500000004 500000004

500000004 500000004

说明

 

有 1 道题,做对的概率是 121 \over 221​ ( 121 \over 221​ 在模 109+710^9+7109+7 意义下为 500000004 )。

分析:dp[i][j],表示在第i道题时,有j道题作对的概率

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <functional>
//#include <unordered_map>
#include <map>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <utility>
#include <cstring>
//#include <multimap>
//#include <multiset>
using namespace std;
#define TLE std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ls now<<1,l,mid
#define rs now<<1|1,mid+1,r
#define lc now<<1
#define rc now<<1|1
#define pb push_back
#define ll long long
#define inf 0x3f3f3f3f
const long long INF = 0x3f3f3f3f3f3f3f3f ;
const int mxn = 2e5+10 ;
const int mod = 1000000000+7 ;
ll n,m,k,t,u,v,w,dp[2000+10][2000+10],dis[mxn],a[mxn],x[mxn],y[mxn],p[mxn];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>p[i];
    dp[0][0] = 1 ;
    for(int i=1;i<=n;i++)
    {
        dp[i][0] = dp[i-1][0]*(1-p[i]+mod)%mod;
        for(int j=1;j<=i;j++)
            dp[i][j] =( dp[i-1][j-1]*p[i]+dp[i-1][j]*(1-p[i]+mod) )%mod;
    }
    for(int i=0;i<=n;i++)
        cout<<dp[n][i]<<" ";
    cout<<endl;
}
发布了94 篇原创文章 · 获赞 29 · 访问量 8554

猜你喜欢

转载自blog.csdn.net/m0_43382549/article/details/104207660