//52行目から編集
#include <iostream>
#include <limits.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <cassert>

#define REP(i,n) for(int i=0;i<n;i++)
#define all(x) (x).begin(),(x).end()
#define mp make_pair
#define pb push_back
#define eb emplace_back
using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vector<int> > vvi;
typedef vector<vector<ll> > vvl;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;

template<class T> bool chmin(T& a,T b){if(a > b){a = b;return true;}else return false;}
template<class T> bool chmax(T& a,T b){if(a < b){a = b;return true;}else return false;}
///////////////////////////////////////////////////////////

struct shop{
    ll a,b;
    bool operator<(shop& anot){
        if(a != 0)return a*(anot.b + 1) > anot.a*(b + 1);
        else return b < anot.b;
    }
};

void debugger(vvl& dp){
    int n = dp.size();
    int m = dp[0].size();
    for(int i = 0;i < n;i++){
        for(int j = 0;j < m;j++){
            if(dp[i][j] >= 100000)cerr << setw(5) << "INF";
            else cerr << setw(5) << dp[i][j];
        }
        cerr << '\n';
    }
}
int main(void){
    cin.tie(0);
    ios::sync_with_stdio(false);

    int n;cin >> n;
    long long T;cin >> T;
    vector<shop> A,B;
    for(int i = 0;i < n;i++){
        ll a,b;cin >> a >> b;
        shop s = {a,b};
        if(a == 0)B.pb(s);else A.pb(s);
    }

    if(A.size())sort(all(A));
    if(B.size())sort(all(B));
   // cerr << "A.size() = " << A.size() << ' ' << "B.size() = " << B.size() << '\n';
    vvl dp(n,vl(30,T+1));
    if(A.size() == 0){
        ll t = 0;
        for(int i = 0;i < n;i++){
            if(t + 1 + B[i].b > T){
                cout << i << '\n';
                return 0;
            }else{
                t = 1 + t + B[i].b;
            }
        }
        cout << n << '\n';
        return 0;
    }else{
        dp.resize(A.size());
        dp[0][0] = 0;
        dp[0][1] = 1 + A[0].a + A[0].b;
        for(int i = 1;i < A.size();i++){
            for(int j = 0;j <= min(29,i+1);j++){
                chmin(dp[i][j] , dp[i-1][j]);
                if(j){
                    ll t = dp[i-1][j-1];
                    if(t + 1 + A[i].a * (t + 1) + A[i].b <= T){
                        chmin(dp[i][j],t + 1 + A[i].a * (t + 1) + A[i].b);
                    }
                }
            } 
        }
        if(B.size()){
            int ans = 0;
            for(int i = 0;i < 30;i++){
                ll t = dp[A.size()-1][i];
                if(t > T)continue;
                int cnt = 0;
                for(int j = 0;j < B.size();j++){
                    if(t + 1 + B[j].b <= T){
                        t = t + 1 + B[j].b;
                        cnt++;
                    }else{
                        break;
                    }
                }
                chmax(ans,i + cnt);
            }
            cout << ans << '\n';
            //debugger(dp);
            return 0;
        }else{
            for(int i = 29;i >= 0;i--){
                if(dp[A.size()-1][i] <= T){
                    cout << i << '\n';
                    return 0;
                }
            }
        }
    }
}


Measured memory_bytes: 58604