#include using namespace std; template inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } using ll = long long; using P = pair; const long double PI = acos(-1.0L); ll GCD(ll a, ll b) { return b?GCD(b, a%b):a; } ll LCM(ll a, ll b) { return a/GCD(a, b)*b; } const ll mod = 1000000007; int n, k; int main() { cin >> n >> k; vector Avec(n, 0); for(int i = 0; i < n; ++i) cin >> Avec[i]; sort(Avec.begin(), Avec.end()); vector< map > divisor(n, map()); for(int i = 0; i < n; ++i) { ll check = Avec[i]; ll limit = sqrt(check) + 1; for(int j = 2; j < limit; ++j) { if(Avec[i] % j == 0) { while(1) { if(Avec[i]%j == 0) { divisor[i][j]++; Avec[i] /= j; }else break; } } } if(Avec[i] != 1) divisor[i][Avec[i]]++; } map > mcnt; ll ans = 1LL; for(int i = 0; i < n; ++i) { for(auto x : divisor[i]) { mcnt[x.first].emplace_back(x.second); } } for(auto x : mcnt) { sort(x.second.begin(), x.second.end(), greater()); int cnt = 0; for(int i = 0; i < min(k, (int)x.second.size()); ++i) cnt += x.second[i]; for(int i = 0; i < cnt; ++i) { ans *= x.first; ans %= mod; } } cout << ans << endl; }