#include using namespace std; #include using namespace atcoder; using ll = int64_t; using ul = uint64_t; using ld = long double; using vi = vector; using vc = vector; using vs = vector; using vb = vector; using vl = vector; using vvi = vector; using vvc = vector; using vvb = vector; using vvl = vector; using mint = modint998244353; using vm = vector; void sieve(int N, vb &del, vi &div) { for (int p = 2; p <= N; p++) { if (del[p]) continue; div[p] = p; for (int a = p*2; a <= N; a += p) { del[a] = true; div[a] = min(div[a], p); } } return; } // pow_mod ll pwmd(ll b, ll e, ll m) { if (e == 0) return 1; ll bef; if (e%2 == 0) bef = pwmd(b, e/2, m)%m; else bef = pwmd(b, e - 1, m)%m; if (e%2 == 0) return bef*bef%m; else return bef*b%m; } int main() { int lim = 1000000; vb del(lim + 1, false); vi div(lim + 1, 1e9); sieve(lim, del, div); ll N,K; cin >> N >> K; vl A(N); for (int i = 0; i < N; i++) { cin >> A[i]; } vvi exps(lim + 1); for (int i = 0; i < N; i++) { if (A[i] == 1) continue; pair cur = {-1, 0}; while(A[i] > 1) { int pri = div[A[i]]; if (cur.first != -1 && cur.first != pri) exps[cur.first].push_back(cur.second); if (cur.first != pri) cur.second = 0; cur.first = pri; cur.second++; A[i] /= pri; } exps[cur.first].push_back(cur.second); } ll mod = 998244353; mint ans = 1; for (ll i = 2; i <= lim; i++) { if (exps[i].size() == 0) continue; while(exps[i].size() < N) exps[i].push_back(0); sort(exps[i].begin(), exps[i].end()); ll exp = exps[i][(N + K - 1)/K - 1]; ans *= pwmd(i, exp, mod); } cout << ans.val() << endl; return 0; }