#include <bits/stdc++.h>
using namespace std;
int n,m;
//体积恰好是j的情况,表示体积要用完
int f[1010];//记录体积恰好是j的情况下的最大价值
int g[1010];//记录体积恰好是j的情况下的方案数
int mod = 1000000000 + 7;
int INF = 1000000;
int v,w;
int t,s;
int main(){
cin>>n>>m;
//背包什么都不装也是一种方案
for(int i = 0;i <= m;i++) g[i] = 1;
//循环物品数
for(int i = 1;i <= n;i++){
cin>>v>>w;
//01背包循环背包容量~当前物品的体积
for(int j = m;j >= v;j--){
t = max(f[j],f[j-v]+w);//选和不选的最大价值
//判断从哪个决策转移过来的
s = 0;
//两个决策如果都是最优的,那么方案是就是两者之和
if(t == f[j]) s = (s+g[j])%mod;//没选是最优的
if(t == f[j-v] + w) s = (s+g[j-v])%mod;//选了是最优的
f[j] = t;
g[j] = s;
}
}
cout<<g[m];
return 0;
}
/**************************************************************
Problem: 1911
User: admin
Language: C++
Result: Accepted
Time:27 ms
Memory:2080 kb
****************************************************************/