dp[i][j] 第i首歌在第j分钟听出来.....
一般情况下: dp[i][j]= dp[ i-1] [ j-k ] * p[i] * (1-p[i])^(k-1)
当k==t[i]时,一定可以听出来还要另加上 dp[ i-1] [ j-k ]*(1-p[i])^k
需要维护一段dp[i-1][k]的和,将时间复制度降到O(n^2)
/* ***********************************************
Author :CKboss
Created Time :2015年03月20日 星期五 14时25分28秒
File Name :CF498B_2.cpp
************************************************ */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int maxn=5500;
int n,T;
double dp[maxn][maxn];
int t[maxn];
double p[maxn];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d%d",&n,&T);
for(int i=1;i<=n;i++)
{
scanf("%lf%d",p+i,t+i); p[i]/=100.;
}
dp[0][0]=1;
double ans=0;
for(int i=1;i<=n;i++)
{
double P=p[i],VP=1-p[i],VPN=pow(VP,t[i]);
double temp=0;
for(int j=0;j<=T;j++)
{
if(j-1>=0) temp+=dp[i-1][j-1];
if(j-t[i]-1>=0) temp-=dp[i-1][j-t[i]-1]*VPN;
dp[i][j]+=temp*P;
if(j-t[i]>=0) dp[i][j]+=dp[i-1][j-t[i]]*VPN;
temp=temp*VP;
ans+=dp[i][j];
}
}
printf("%.11lf\n",ans);
return 0;
}