func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mn = 55;   const int mm = 2505;   const int mod = 1000000007;   int n, m, T;   int t[mm], g[mm];   int a[mn][mm];   int bc[mn][mn][mm];   int way[mn][mn][mn][3];   int cnt[3];   void init_a() {     memset(a, -2, sizeof a);     a[0][0] = 1;     for (int k = 1; k <= n; k++) {       if (g[k]) continue;       for (int i = cnt[0]; i >= 0; i--) {         for (int j = T - t[k]; j >= 0; j--) {           if (a[i][j] <= 0) continue;           int &ans = a[i + 1][j + t[k]];           if (ans < 0) ans = 0;           ans += a[i][j];           if (ans >= mod) ans -= mod;         }       }       cnt[0]++;     }   }   void init_bc() {     memset(bc, -2, sizeof bc);     bc[0][0][0] = 1;     for (int k = 1; k <= n; k++) {       if (!g[k]) continue;       for (int i = cnt[1]; i >= 0; i--) {         for (int j = cnt[2]; j >= 0; j--) {           for (int l = T - t[k]; l >= 0; l--) {             if (bc[i][j][l] <= 0) continue;             int &ans = bc[i + (g[k] == 1)][j + (g[k] == 2)][l + t[k]];             if (ans < 0) ans = 0;             ans += bc[i][j][l];             if (ans >= mod) ans -= mod;           }         }       }       if (g[k] == 1)         cnt[1]++;       else         cnt[2]++;     }   }   void inc(int &a, int b) {     if (a < 0) a = 0;     a += b;     if (a >= mod) a -= mod;   }   void init_way() {     memset(way, -2, sizeof(way));     way[1][0][0][0] = way[0][1][0][1] = way[0][0][1][2] = 1;     for (int i = 0; i <= cnt[0]; i++) {       for (int j = 0; j <= cnt[1]; j++) {         for (int k = 0; k <= cnt[2]; k++) {           for (int last = 0; last < 3; last++) {             for (int nxt = 0; nxt < 3; nxt++) {               if (nxt == last || way[i][j][k][last] <= 0) continue;               int uans = way[i][j][k][last];               if (nxt == 0)                 inc(way[i + 1][j][k][0], uans);               else if (nxt == 1)                 inc(way[i][j + 1][k][1], uans);               else                 inc(way[i][j][k + 1][2], uans);             }           }         }       }     }   }   inline int getway(int i, int j, int k) {     int ans = 0;     for (int last = 0; last < 3; last++) {       if (way[i][j][k][last] <= 0) continue;       inc(ans, way[i][j][k][last]);     }     return ans;   }   int fact[105];   int main() {     scanf( %d%d , &n, &T);     for (int i = 1; i <= n; i++) scanf( %d%d , &t[i], &g[i]), g[i]--;     fact[0] = 1;     for (int i = 1; i <= 55; i++) fact[i] = (long long)fact[i - 1] * i % mod;     init_a();     init_bc();     init_way();     long long ans = 0;     for (int i = 0; i <= cnt[0]; i++) {       for (int j = 0; j <= cnt[1]; j++) {         for (int k = 0; k <= cnt[2]; k++) {           for (int t = 0; t <= T; t++) {             if (a[i][t] <= 0 || bc[j][k][T - t] <= 0) continue;             ans = (ans + (long long)a[i][t] * bc[j][k][T - t] % mod *                              getway(i, j, k) % mod * fact[i] % mod * fact[j] %                              mod * fact[k]) %                   mod;           }         }       }     }     printf( %lld n , ans);     return 0;   }   