#include <bits/stdc++.h>
using namespace std;
void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << endl;
  err(++it, args...);
}
template <typename T>
void println(T &t) {
  cout << t << "\n";
}
template <typename T>
void printV(const T &t) {
  std::copy(t.cbegin(), t.cend(),
            std::ostream_iterator<typename T::value_type>(std::cout, " "));
  cout << "\n";
}
template <typename T>
void printVV(const T &t) {
  for (size_t i = 0; i < t.size(); i++) {
    printf("%d: ", i);
    printV(t[i]);
  }
}
template <typename T, typename S>
void printVP(vector<pair<T, S>> vp) {
  if (vp.empty()) {
    cout << "\n";
    return;
  }
  for (size_t i = 0; i < vp.size() - 1; i++) {
    cout << "(" << vp[i].first << " " << vp[i].second << ") ";
  }
  cout << "(" << vp[vp.size() - 1].first << " " << vp[vp.size() - 1].second
       << ")\n";
}
template <typename T, typename S>
void printVVP(vector<vector<pair<T, S>>> vvp) {
  for (size_t i = 0; i < vvp.size(); i++) {
    cout << i << ": ";
    printVP(vvp[i]);
  }
}
vector<string> split(const string &s, char delim) {
  vector<string> result;
  stringstream ss(s);
  string item;
  while (getline(ss, item, delim)) {
    result.push_back(item);
  }
  return result;
}
bool is_number(const string &s) {
  string::const_iterator it = s.begin();
  while (it != s.end() && isdigit(*it)) ++it;
  return !s.empty() && it == s.end();
}
void fast() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
}
struct Can {
  long long x, r, id;
};
bool compareByX(const Can &lhs, const Can &rhs) { return lhs.x < rhs.x; }
class Person {
 public:
  string name, speak;
  unordered_set<string> understands;
  friend ostream &operator<<(ostream &os, const Person &p) {
    os << p.name << '(' << p.speak << "):";
    for (auto s : p.understands) os << " " << s;
    return os;
  }
};
vector<pair<int, int>> deltas = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
const int INF = 1e9 + 10;
const long long inf = 1e18;
const long double PI = 3.14159265359;
bool colin(pair<int, int> &p1, pair<int, int> &p2, pair<int, int> &p3) {
  return (p2.first - p1.first) * (p3.second - p1.second) ==
         (p2.second - p1.second) * (p3.first - p1.first);
}
void min_self(int &a, int b) { a = min(a, b); }
void max_self(int &a, int b) { a = max(a, b); }
void min_self(long long &a, long long b) { a = min(a, b); }
void max_self(long long &a, long long b) { a = max(a, b); }
const int mod = 1e9 + 7;
void addmod(int &a, int b) {
  a += b;
  if (a >= mod) a -= mod;
}
void submod(int &a, int b) {
  a -= b;
  if (a < 0) a += mod;
}
void mulmod(long long &a, long long b) {
  a *= b;
  a %= mod;
}
const int maxn = 5001;
const int maxt = 5001;
double dp[maxn][maxt];
const double MINP = 1e-15;
int main() {
  int N, T;
  cin >> N >> T;
  vector<double> P(N);
  vector<int> C(N);
  for (int i = 0; i < (N); ++i) {
    cin >> P[i] >> C[i];
    P[i] /= 100;
  }
  dp[0][0] = 1;
  for (int i = 0; i < N; ++i) {
    double p = P[i];
    double q = 1 - P[i];
    for (int t = 0; t < T; t++) {
      double prob = dp[i][t];
      if (dp[i][t] < MINP) continue;
      for (int k = 1; k < C[i]; k++) {
        if (prob < MINP) break;
        dp[i + 1][t + k] += prob * p;
        prob *= q;
        if (t + k == T) {
          dp[i][T] += prob;
          break;
        }
      }
      if (prob > MINP && t + C[i] <= T) dp[i + 1][t + C[i]] += prob;
    }
  }
  double ans = 0;
  for (int k = 1; k <= N; k++) {
    ans += k * dp[k][T];
  }
  for (int t = 1; t < T; t++) {
    ans += N * dp[N][t];
  }
  cout << fixed << setprecision(9) << ans << '\n';
}
