#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}; ll greedy(ll n, ll k, vector a) { vector iot(n); iota(all(iot), 0); sort(all(iot)); ll gcds = 0; do { ll lcms = 1; rep(i,0,n-k+1) { ll gd = 0; rep(j,0,k) { gd = gcd(gd, a[iot[i+j]]); } lcms = lcm(lcms, gd); } gcds = gcd(gcds, lcms); }while(next_permutation(all(iot))); return gcds % mod; } ll solve(ll n, ll k, vector a); void test() { ll n = 5; int itr = 0; while(true) { itr++; if(itr % 100000 == 0) cout << itr << endl << flush; ll k = rand()%5+1; vector a(n); rep(i,0,n) a[i] = rand()%100; if(greedy(n,k,a) != solve(n,k,a)) { cout << n << " " << k << endl; for(auto x: a) cout << x << " "; cout << endl; cout << greedy(n,k,a) << " " << solve(n,k,a) << endl; return; } } } int main() { // test(); int t = 1; // cin >> t; while(t--) { ll n,k; cin >> n >> k; vector a(n); rep(i,0,n) cin >> a[i]; ll ans = solve(n,k,a); cout << ans << endl; // ans = greedy(n,k,a); // cout << ans << endl; } } 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; } ll solve(ll n, ll k, vector a){ // 各素因数について そうでないものの の個数が n/k 未満 -> n/k 個目の大きさを見る 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[i])); 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; } return ans; }