func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 1e9 + 7;   const int sz2 = 5e5 + 1;   int fact[sz2];   int inv_fact[sz2];   int mul(int a, int b) { return (long long)a * b % mod; }   int add(int a, int b) {     int res = (long long)a + b;     if (res < 0)       res += mod;     else if (res > mod)       res -= mod;     return res;   }   int bpow(int x, int p) {     int res = 1;     while (p) {       if (p & 1) res = mul(res, x);       p >>= 1;       if (p) x = mul(x, x);     }     return res;   }   int inv(int x) { return bpow(x, mod - 2); }   void calc_fact() {     fact[0] = inv_fact[0] = 1;     for (int i = 1; i < sz2; i++) {       fact[i] = mul(fact[i - 1], i);       inv_fact[i] = inv(fact[i]);     }   }   int cnk(int n, int k) {     if (k > n) return 0;     return mul(fact[n], mul(inv_fact[k], inv_fact[n - k]));   }   const int sz = 55;   int dp[sz * sz][sz][sz];   int dp1[sz * sz][sz];   int dp2[sz][sz][sz][sz][3];   void solve() {     int n, t;     cin >> n >> t;     vector<pair<int, int>> a(n);     for (int i = 0; i < n; i++) {       cin >> a[i].first >> a[i].second;       a[i].second--;     }     dp[0][0][0] = 1;     dp1[0][0] = 1;     for (int i = 0; i < n; i++) {       if (a[i].second <= 1) {         for (int j = t; j >= 0; j--) {           for (int k = 0; k < n; k++) {             for (int l = 0; l < n; l++) {               if (j + a[i].first <= t)                 dp[j + a[i].first][k + (a[i].second == 0)]                   [l + (a[i].second == 1)] =                       add(dp[j + a[i].first][k + (a[i].second == 0)]                             [l + (a[i].second == 1)],                           dp[j][k][l]);             }           }         }       } else {         for (int j = t; j >= 0; j--) {           for (int k = 0; k < n; k++) {             if (j + a[i].first <= t)               dp1[j + a[i].first][k + 1] =                   add(dp1[j + a[i].first][k + 1], dp1[j][k]);           }         }       }     }     dp2[1][1][0][0][0] = 1;     dp2[1][0][1][0][1] = 1;     dp2[1][0][0][1][2] = 1;     for (int i = 1; i < n; i++) {       for (int j = 0; j <= n; j++) {         for (int k = 0; k <= n; k++) {           for (int l = 0; l <= n; l++) {             for (int h = 0; h < 3; h++) {               for (int g = 0; g < 3; g++) {                 if (g != h)                   dp2[i + 1][j + (g == 0)][k + (g == 1)][l + (g == 2)][g] =                       add(dp2[i + 1][j + (g == 0)][k + (g == 1)][l + (g == 2)][g],                           dp2[i][j][k][l][h]);               }             }           }         }       }     }     int ans = 0;     for (int i = 0; i <= t; i++) {       for (int j = 0; j <= n; j++) {         for (int k = 0; k <= n; k++) {           for (int l = 0; l <= n; l++) {             if (j + k + l > n) continue;             int p = mul(                 mul(dp[i][j][k], dp1[t - i][l]),                 add(dp2[j + k + l][j][k][l][0],                     add(dp2[j + k + l][j][k][l][1], dp2[j + k + l][j][k][l][2])));             int r = mul(fact[j], mul(fact[k], fact[l]));             ans = add(ans, mul(p, r));           }         }       }     }     cout << ans;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     calc_fact();     int q = 1;     for (; q > 0; q--) {       solve();     }   }   