#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
const long long MOD = 998244353;
long long solve(int n, int x) {
// Sử dụng dynamic programming
// dp[i][j] = số cách chọn i phần tử có tổng j
vector<vector<long long>> dp(n + 1, vector<long long>(x + 1, 0));
dp[0][0] = 1; // Cách duy nhất để chọn 0 phần tử có tổng 0
// Với mỗi số từ 1 đến x
for (int num = 1; num <= x; num++) {
// Duyệt ngược để tránh sử dụng cùng một số nhiều lần
for (int i = min(n, num); i >= 1; i--) {
for (int j = num; j <= x; j++) {
dp[i][j] = (dp[i][j] + dp[i-1][j-num]) % MOD;
}
}
}
long long result = 0;
// Đếm các tập hợp có đúng n phần tử
for (int sum = n; sum <= x; sum++) {
result = (result + dp[n][sum]) % MOD;
}
return result;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while (t--) {
int n, x;
cin >> n >> x;
cout << solve(n, x) << "\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgbG9uZyBsb25nIE1PRCA9IDk5ODI0NDM1MzsKCmxvbmcgbG9uZyBzb2x2ZShpbnQgbiwgaW50IHgpIHsKICAgIC8vIFPhu60gZOG7pW5nIGR5bmFtaWMgcHJvZ3JhbW1pbmcKICAgIC8vIGRwW2ldW2pdID0gc+G7kSBjw6FjaCBjaOG7jW4gaSBwaOG6p24gdOG7rSBjw7MgdOG7lW5nIGoKICAgIHZlY3Rvcjx2ZWN0b3I8bG9uZyBsb25nPj4gZHAobiArIDEsIHZlY3Rvcjxsb25nIGxvbmc+KHggKyAxLCAwKSk7CiAgICAKICAgIGRwWzBdWzBdID0gMTsgLy8gQ8OhY2ggZHV5IG5o4bqldCDEkeG7gyBjaOG7jW4gMCBwaOG6p24gdOG7rSBjw7MgdOG7lW5nIDAKICAgIAogICAgLy8gVuG7m2kgbeG7l2kgc+G7kSB04burIDEgxJHhur9uIHgKICAgIGZvciAoaW50IG51bSA9IDE7IG51bSA8PSB4OyBudW0rKykgewogICAgICAgIC8vIER1eeG7h3QgbmfGsOG7o2MgxJHhu4MgdHLDoW5oIHPhu60gZOG7pW5nIGPDuW5nIG3hu5l0IHPhu5Egbmhp4buBdSBs4bqnbgogICAgICAgIGZvciAoaW50IGkgPSBtaW4obiwgbnVtKTsgaSA+PSAxOyBpLS0pIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IG51bTsgaiA8PSB4OyBqKyspIHsKICAgICAgICAgICAgICAgIGRwW2ldW2pdID0gKGRwW2ldW2pdICsgZHBbaS0xXVtqLW51bV0pICUgTU9EOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBsb25nIGxvbmcgcmVzdWx0ID0gMDsKICAgIAogICAgLy8gxJDhur9tIGPDoWMgdOG6rXAgaOG7o3AgY8OzIMSRw7puZyBuIHBo4bqnbiB04butCiAgICBmb3IgKGludCBzdW0gPSBuOyBzdW0gPD0geDsgc3VtKyspIHsKICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgZHBbbl1bc3VtXSkgJSBNT0Q7CiAgICB9CiAgICAKICAgIHJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwogICAgCiAgICBpbnQgdDsKICAgIGNpbiA+PiB0OwogICAgCiAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgaW50IG4sIHg7CiAgICAgICAgY2luID4+IG4gPj4geDsKICAgICAgICAKICAgICAgICBjb3V0IDw8IHNvbHZlKG4sIHgpIDw8ICJcbiI7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9