題目
他要我們求的是在n道題目中,有0,1,2,3…n道題目做對的概率,然後分別按隔一個空格輸出對1e9+7求模後的結果,首先,我來解釋一下下面幾個代碼的含義:
在代碼中,我們先定義一個二維數組,f[2020][2020],對於f[i][j]的含義是在當前的i道題目中,恰好有j道題目做對的概率(以下所說的概率都是求模後的結果)。
const int mod=1e9+7;
(mod+1-p[i])%mod
該式的意義是第i題做錯的概率。爲了方便計算,我們都是假設分式a/b當中分母b的值爲1,即b=1,(因爲任何分式都可以化爲分母爲1的式子,當然,分子a可以爲小數。所以由b*q%(1e9+7)=a;這裏b=1,q就是我們輸入的p[i],可得p[i]=kmod+a;即a=p[i]-kmod;那麼求對應的錯誤的概率就是用1-a,即1-a=(kmod+1-p[i])%mod=(mod+1-p[i])%mod,因爲分母b爲1;
f[i][0]=f[i-1][0]*(mod+1-p[i])%mod;
那麼,該行代碼的意思就是當前有i道題目,有0道做對的概率等於i-1道題目中有0道題目做對的概率再乘以第i道題目做錯的概率。
f[i][j]=(f[i-1][j]*(mod+1-p[i])%mod+f[i-1][j-1]*p[i])%mod;
所以,這個代碼就不難理解了。即要求i道題目中,j道題目做對的概率,就是相當於求i-1道題目中j道題目做對的概率乘以第i道題目做錯的概率,再加上i-1道題目中j-1道題目做對的概率乘以第i道題目做對的概率
全部代碼
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll p[2020],f[2020][2020];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>p[i];
f[0][0]=1;
for(int i=1;i<=n;i++){
f[i][0]=f[i-1][0]*(mod+1-p[i])%mod;
for(int j=1;j<=i;j++){
f[i][j]=(f[i-1][j]*(mod+1-p[i])%mod+f[i-1][j-1]*p[i])%mod;
}
}
for(int i=0;i<=n;i++){
cout<<f[n][i];
if(i<n)cout<<" ";
}
return 0;
}