2020牛客寒假算法基础集训营2 C算概率

2020牛客寒假算法基础集训营2 C算概率_第1张图片比赛时考虑到了:

1.中间两个int相乘可能会溢出
2.1-p[i]可能是负的 得(1-p[i]+M)%M
但漏乘了答错的概率,前i-1个人对k道 说明第i个人是答错的 直接d[i-1][k]了
体会:虽然概率给出的是a*(b的逆元)但对模意义下的乘除(四则运算)无影响


故在模意义下$1-\frac{a}{b}=1-a*b^{-1}=1-p[i]\left ( \mod p \right )$
$ab\equiv1(\mod P) $
$\frac{1}{b}\equiv a(mod P)$ a为$\frac{1}{b}$在mod意义下的逆元 记为$b^{-1}$ 若P为质数则一一对应 故在模意义下可以用逆元代替分数
对$10^{9}+7$取模的含义是:对于一个$b\neq 0$的不可约分数$\frac{a}{b}$,存在q使得$b\times q\mod \left ( 10^{9} +7\right )=a$,q即为$\frac{a}{b}$对$10^{9}+7$取模的结果
 
#include
using namespace std;
const int M=1e9+7;
const int N=2e3+5;
int p[N],d[N][N];


int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>p[i];
    d[0][0]=1;
    for(int i=1;i<=n;i++)d[i][0]=1ll*d[i-1][0]*(1-p[i]+M)%M;
    for(int k=1;k<=n;k++)
     for(int i=k;i<=n;i++)//i=1也行 
      d[i][k]=(1ll*d[i-1][k]*(1-p[i]+M)%M+1ll*d[i-1][k-1]*p[i]%M)%M;//前i-1个人对k道  说明第i个人是答错的 漏乘了答错的概率 
      for(int i=0;i<=n;i++)
       cout<' ';
 return 0;
}

 

你可能感兴趣的:(2020牛客寒假算法基础集训营2 C算概率)