先考慮這麼一個式子:
這個式子是錯的,因爲 第1次不選2和第2次不選1的概率不是獨立的。
所以直接算的方法gg了。
設
那麼枚舉前i-1個點被選的個數j,
#include <bits/stdc++.h>
using namespace std;
#define N 230
int T,n,r;
double p[N],d[N],f[N][N],ans;
double qpow(double x,int y)
{
double ret=1;
while(y)
{
if(y&1)ret=ret*x;
x=x*x;y>>=1;
}
return ret;
}
int main()
{
//freopen("tt.in","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&r);ans=0;
for(int i=1;i<=n;i++)
scanf("%lf%lf",&p[i],&d[i]);
memset(f,0,sizeof(f));
f[0][0]=1;
for(int i=1;i<=n;i++)
{
double sum=0;
for(int j=0;j<i&&j<=r;j++)
{
double t=1-qpow(1-p[i],r-j);
sum+=f[i-1][j]*t;
f[i][j]+=f[i-1][j]*(1-t);
f[i][j+1]+=f[i-1][j]*t;
}
ans+=sum*d[i];
}
printf("%.10f\n",ans);
}
return 0;
}