https://ac.nowcoder.com/acm/contest/3003/C
这题用了整数表示概率;
分数的取模可以用费马小定理算;
写了个板子;
ll qp(ll a,ll b, ll mod) //ans=a^b%mod
{
ll ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
b>>=1;
a=(a*a)%mod;
}
return ans%mod;
}
ll fsy(ll z,ll m,ll mod)
{
return (1LL * (z%mod) * qp(m, mod-2, mod))%mod;
}
题中直接给了整数形式的,算相反概率直接1-p就行
#include
using namespace std;
const int mod=1e9+7;
long long 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; //0道题目做对0题的概率是1
for(int i=1;i<=n;i++){
f[i][0]=f[i-1][0]*(mod+1-p[i])%mod; //求有i道题目做对0道题目的概率
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;
//由类推求出当前有i道题目中,做对j道题目的概率
//i道对j道的概率就是i-1道对j道时最后一道错和对j-1道最后一道对的概率和
}
}
for(int i=0;i<=n;i++){
cout<<f[n][i];
if(i<n) cout<<" ";
}
return 0;
}