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

题目描述

牛牛刚刚考完了期末,尽管牛牛做答了所有 n 道题目,但他不知道有多少题是正确的。
不过,牛牛知道第 i 道题的正确率是 pi
牛牛 想知道这 n 题里恰好有 0,1,…,n 题正确的概率分别是多少,对 109+7取模。
对 109+7取模的含义是:对于一个 b≠0的不可约分数 a/b,存在 q 使得 b×q mod (109+7)=a,q 即为 a/b 对 109+7取模的结果。

输入描述:

第一行,一个正整数 n 。
第二行,n 个整数 p1,p2,…,pn,在模 109+7意义下给出。
保证 1≤n≤2000。

输出描述:

输出一行 n+1个用空格隔开的整数表示答案(对 109+7取模)。

输入

  1.  

输出

说明

有 1 道题,做对的概率是 1/2 ( 1/2在模 109+7意义下为 500000004 )。

先说一点:

mod为109+7,为质数

inv(b,mod) 表示b对mod的逆元,由费马小定理知b对mod的逆元即为bmod-2

求(a/b)%mod即为求(a*inv(b,mod))%mod,即等于该题的p。

  1. long long fpow(long long a, long long b)
  2. {
  3. if (a == ) return ;
  4. long long ans = ;
  5. for (; b; b >>= , a = (a % mod * a% mod) % mod)
  6. if (b & ) ans = (ans % mod * a % mod) % mod;
  7. return ans;
  8. }
  9. LL inv(LL a,LL mo)
  10. {
  11. return fpow(a,mo-)%mo;
  12. }
  13. //求(a/b)%mod: printf("%lld\n",a*inv(b,mod)%mod);

另外注意到(a/b)%mod+(1- a/b)%mod = mod+1,由此可通过某事件概率求得其对立概率。

该题总体来说还是用dp来做,只不过用概率%mod(即题中p)来代替原本的概率即可。

dp[ i ][ j ] 表示前 i 道题做对 j 道的概率。

转移时考虑第 j 道题是否做对,转移方程为:dp[ i ][ j ]=dp[ i-1 ][ j ]×(1−pi)+dp[ i-1 ][ j-1 ]×pi  。

时间复杂度 O(n2)

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <math.h>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <stack>
  9. #include <queue>
  10. #include <set>
  11. #include <map>
  12. #include <sstream>
  13. const int INF=0x3f3f3f3f;
  14. typedef long long LL;
  15. const LL mod=1e9+;
  16. const int maxn=1e4+;
  17. using namespace std;
  18.  
  19. LL P[];//表示第i道题做对的概率
  20. LL dp[][];//dp[i][j]表示前i道题做对j道的概率
  21.  
  22. int main()
  23. {
  24. #ifdef DEBUG
  25. freopen("sample.txt","r",stdin);
  26. #endif
  27.  
  28. int n;
  29. scanf("%d",&n);
  30. for(int i=;i<=n;i++)
  31. scanf("%lld",&P[i]);
  32. dp[][]=;
  33. for (int i = ; i <= n; i++)
  34. {
  35. dp[i][] = dp[i - ][] * (mod + - P[i]) % mod;
  36. for (int j = ; j <= i; ++j)
  37. dp[i][j] = (dp[i - ][j] * (mod + - P[i]) + dp[i - ][j - ] * P[i]) % mod;
  38. }
  39. for(int i=;i<=n;i++)
  40. printf(i==n?"%lld\n":"%lld ",dp[n][i]);
  41.  
  42. return ;
  43. }

-

算概率(dp,数论)的更多相关文章

  1. Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)

    Problem   Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...

  2. HDU 4599 概率DP

    先推出F(n)的公式: 设dp[i]为已经投出连续i个相同的点数平均还要都多少次才能到达目标状态. 则有递推式dp[i] = 1/6*(1+dp[i+1]) + 5/6*(1+dp[1]).考虑当前这 ...

  3. poj 2096 Collecting Bugs (概率dp 天数期望)

    题目链接 题意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcom ...

  4. HDU 4599 Dice (概率DP+数学+快速幂)

    题意:给定三个表达式,问你求出最小的m1,m2,满足G(m1) >= F(n), G(m2) >= G(n). 析:这个题是一个概率DP,但是并没有那么简单,运算过程很麻烦. 先分析F(n ...

  5. poj 2151 Check the difficulty of problems(概率dp)

    poj double 就得交c++,我交G++错了一次 题目:http://poj.org/problem?id=2151 题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 问 ...

  6. POJ2151-Check the difficulty of problems(概率DP)

    Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4512   ...

  7. 概率dp专辑

    求概率 uva11021 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  8. HDU5985 Lucky Coins 概率dp

    题意:给你N种硬币,每种硬币有Si个,有Pi 概率朝上,每次抛所有硬币抛起,所有反面的拿掉,问每种硬币成为最后的lucky硬币的概率. 题解:都知道是概率dp,但是模拟赛时思路非常模糊,很纠结,dp[ ...

  9. 概率DP求解例题

    1,逆推状态:山东省赛2013年I题 Problem I: The number of steps Description Mary stands in a strange maze, the maz ...

  10. 洛谷P3158 放棋子 [CQOI2011] dp+数论

    正解:dp+数论 解题报告: 传送门! 考虑对每种颜色的棋子单独考虑鸭,那显然有,当某一行或某一列已经被占据的时候,那一行/一列就不能再放别的颜色的棋子了,相当于直接把那一行/一列直接消了 显然就能考 ...

随机推荐

  1. Python最新暴力破解WiFi,攻破所有密码限制,最强破解!

    暴力破解wifi密码 这个代码也是非常简单,这里需要用Python中的pywifi这个库,所以需要在DOS命令下安装这个库,同样使用pip install pywifi,很简单就安装成功了,我用的是P ...

  2. 项目启动报错:Communications link failure

    2017-12-29 10:43:19,776 ERROR [com.alibaba.druid.pool.DruidDataSource] - <init datasource error, ...

  3. android studio3.1 添加闪屏页面(启动欢迎界面)(例子简单无BUG)

    截图 启动页的 activity_splash.xml  我用了一张图片自己添加吧 <?xml version="1.0" encoding="utf-8" ...

  4. Yarn的资源调优

    一.概述 每个job提交到yarn上执行时,都会分配Container容器去运行,而这个容器需要资源才能运行,这个资源就是Cpu和内存. 1.CPU资源调度 目前的CPU被Yarn划分为虚拟CPU,这 ...

  5. 怎样解题 --解题表(how to solve it)

    <怎样解题> 美.波利亚 下面是来自书中的解题表: 理解题目 第一 理解题目 你必须理解题目 未知量是什么?已知数据是什么?条件是什么? 条件有可能满足吗?条件是否可以确定未适量?或者它不 ...

  6. Elasticsearch常用的设置

    action.destructive_requires_name: true     用于设置删除只限于特定名称指向的数据, 而不允许通过指定 _all来删除所有索引

  7. 三十、SAP中的内置图标

    一.选择[编辑]->[模式] 二.选中写入模式 三.选中图标 四.选择我们需要的图标 五.选中图标后,选择复制 六.点击之后,会回到代码界面,如下 七.执行结果如下,显示出了一个神奇的图标

  8. tomcat和servlet容器的关系

  9. C# NPOI的数据批量导入数据库

    public ActionResult Upload(HttpPostedFileBase Namefile)        {            //判断文件是否存在            if ...

  10. CVE-2010-0249(极光)分析报告

    2019/9/10          报告doc在文件里面 1.    发现可疑流量 A.分析流量,导出字节流 B.得到网页代码,发现需要执行的代码需要解密(加密的字符串部分太长了,就省略了): C. ...