#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#define llint long long
#define inf 3e18

using namespace std;
typedef pair<llint, llint> P;

llint n, T;
vector<P> avec, bvec;
llint dp[200005][45];

bool comp(P x1, P x2)
{
	return x2.first*(x1.second+1) < x1.first*(x2.second+1);
}

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n >> T;
	llint a, b;
	for(int i = 1; i <= n; i++){
		cin >> a >> b;
		if(a == 0) bvec.push_back(P(a, b));
		else avec.push_back(P(a, b));
	}
	sort(avec.begin(), avec.end(), comp);
	sort(bvec.begin(), bvec.end());
	
	llint m = avec.size();
	for(int i = 0; i <= m; i++){
		for(int j = 0; j < 45; j++){
			dp[i][j] = inf;
		}
	}
	dp[0][0] = 0;
	for(int i = 0; i < m; i++){
		llint a = avec[i].first, b = avec[i].second;
		for(int j = 0; j < 45; j++){
			if(dp[i][j] > T) continue;
			dp[i+1][j] = min(dp[i+1][j], dp[i][j]);
			if(j+1 < 45) dp[i+1][j+1] = min(dp[i+1][j+1], (a+1)*(dp[i][j]+1) + b);
		}
	}
	
	llint ans = 0;
	for(int i = 0; i < 45; i++){
		if(dp[m][i] > T) continue;
		llint tmp = i;
		for(int j = 0; j < bvec.size(); j++){
			llint v = bvec[j].second;
			if(dp[m][i] + v + 1 <= T) tmp++, dp[m][i] += v + 1;
			else break;
		}
		ans = max(ans, tmp);
	}
	cout << ans << endl;
	
}