#include using namespace std; //高速化 struct ponjuice{ponjuice(){cin.tie(0);ios::sync_with_stdio(0);cout<= 0; i--) #define per2(i, n) for(ll i = n-1; i >= 0; i--) #define per3(i, a, b) for(ll i = b-1; i >= a; i--) #define per4(i, a, b, step) for(ll i = b-1; i >= a; i-= step) #define per(...) overload4(__VA_ARGS__, per4, per3, per2, per1)(__VA_ARGS__) //関数 #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() templateinline bool chmax(S& a, T b){return a < b && ( a = b , true);} templateinline bool chmin(S& a, T b){return a > b && ( a = b , true);} //定数 constexpr ll mod = 998244353; constexpr ll minf=-(1<<29); constexpr ll inf=(1<<29); constexpr ll MINF=-(1LL<<60); constexpr ll INF=(1LL<<60); const int dx[4] ={-1, 0, 1, 0}; const int dy[4] ={ 0, 1, 0,-1}; const int dx8[8] ={-1,-1,-1, 0, 1, 1, 1, 0}; const int dy8[8] ={-1, 0, 1, 1, 1, 0,-1,-1}; void solve(); int main() { int t = 1; // cin >> t; while(t--)solve(); } vector> factorize(ll x){ vector> res; for(ll i = 2; i*i <= x; i++){ if(x % i == 0){ if(res.size() && res.back().first == i){ res.back().second++; }else{ res.emplace_back(i,1); } x/=i; i--; } } if(x != 1){ if(res.size() && res.back().first == x){ res.back().second++; }else{ res.emplace_back(x,1); } } return res; } ll powll(ll x, ll n) { ll res = 1; while(n > 0) { if(n & 1) { res = res * x % mod; } x = x*x % mod; n >>= 1; } return res; } void solve(){ ll n,k; cin >> n >> k; vector a(n); rep(i,0,n) cin >> a[i]; // 各素因数について そうでないものの の個数が n/k 未満 -> n/k 個目の大きさを見る unordered_map ind; vector> vs; rep(i,0,n) { auto res = factorize(a[i]); for(auto [v, k]: res) { if(ind.count(v) == 0) { ind[v] = vs.size(); vs.push_back({}); } vs[ind[v]].push_back(k); } } rep(i,0,vs.size()) sort(rall(vs)); int x = n/k; ll ans = 1; for(auto [v, i]: ind) { // if(vs[i].size() <= n-x) continue; ans = ans * powll(v, vs[i][n-x]) % mod; } cout << ans << endl; }