#include<bits/stdc++.h>
using namespace std;

#define int long long
const int _ = 2e5 + 7;
int N , T , dp[_][50]; struct thing{int A , B;}now[_];

signed main(){
	cin >> N >> T; memset(dp , 0x3f , sizeof(dp)); dp[0][0] = 1;
	for(int i = 1 ; i <= N ; ++i){cin >> now[i].A >> now[i].B; ++now[i].B;}
	sort(now + 1 , now + N + 1 , [&](thing p , thing q){return p.B * q.A < p.A * q.B;});
	for(int i = 1 ; i <= N ; ++i)
		if(now[i].A == 0){
			sort(now + i , now + N + 1 , [&](thing p , thing q){return p.B < q.B;});
			int mx = 0;
			for(int j = 0 ; j < 50 ; ++j)
				if(dp[i - 1][j] <= T + 1){
					int pos = i , sum = dp[i - 1][j]; while(pos <= N && (sum += now[pos].B) <= T + 1) ++pos;
					mx = max(mx , j + pos - i);
				}
			cout << mx << endl; return 0;
		}
		else{
			dp[i][0] = dp[i - 1][0];
			for(int j = 1 ; j < 50 ; ++j)
				if(dp[i - 1][j - 1] <= T) dp[i][j] = min(dp[i - 1][j] , dp[i - 1][j - 1] * (now[i].A + 1) + now[i].B);
				else dp[i][j] = dp[i - 1][j];
		}
	int mx = 0; while(dp[N][mx] <= T + 1) ++mx;
	cout << --mx << endl;
	return 0;
}
