#include #include using namespace std; using ll = long long; using mint = atcoder::modint998244353; template struct csr { struct Node { csr* g; int u; template void emplace_back(Args&&... args){ g->add_edge(u, T(std::forward(args)...)); } auto begin(){ return g->E.begin() + g->start[u]; } auto end(){ return g->E.begin() + g->start[u + 1]; } int size(){ return g->start[u + 1] - g->start[u]; } T& operator[](int p){ return *(begin() + p); } }; int N; std::vector start; std::vector E; std::vector> edge; csr(int n) : N(n), start(n + 1) {edge.reserve(n);} void add_edge(int u, T v){ assert(0 <= u && u < N); start[u + 1]++; edge.emplace_back(u, v); } void build(){ E.resize(edge.size()); for(int i = 0; i < N; i++) start[i + 1] += start[i]; auto cnt = start; for(auto [u, v] : edge) E[cnt[u]++] = v; } const int size() {return N;} Node operator[](int u) {return Node{this, u};} }; int main(){ ios::sync_with_stdio(false); cin.tie(0); constexpr int th = 1'000'000; vector pr(th + 1); csr tb(th + 1); for(int i = 2; i <= th; i++){ if(pr[i]) continue; for(int j = i; j <= th; j += i){ pr[j] = true; int v = j, cnt = 0; do{ v /= i; cnt++; }while(v % i == 0); tb[j].emplace_back(cnt); } } tb.build(); vector dp(20); for(int i = 1; i < 20; i++){ for(int a = 0; a <= i; a++){ for(int b = 0; a + b <= i; b++){ int c = i - (a + b); for(int a2 = 0; a2 <= i && a + a2 <= i; a2++){ for(int b2 = 0; a2 + b2 <= i && b + b2 <= i; b2++){ int c2 = i - (a2 + b2); int a3 = i - (a + a2); int b3 = i - (b + b2); int c3 = i - (c + c2); if(a3 + b3 + c3 == i && c3 >= 0) dp[i]++; } } } } } int T; cin >> T; while(T--){ int v; cin >> v; if(v == 1){ cout << "1\n"; continue; } mint ans = 1; for(auto &&vl : tb[v]) ans *= dp[vl]; cout << ans.val() << '\n'; } }