#include #include #include #include #include #include #include #include #include #include #include #include #include #define repd(i,a,b) for (int i=(int)(a);i<(int)(b);i++) #define rep(i,n) repd(i,0,n) #define all(x) (x).begin(),(x).end() #define mod 1000000007 #define inf 2000000007 #define mp make_pair #define pb push_back typedef long long ll; using namespace std; template inline void output(T a, int p) { if(p) cout << fixed << setprecision(p) << a << "\n"; else cout << a << "\n"; } // end of template template inline void voutput(T &v){ rep(i, v.size()){ if (i) cout << " " << v[i]; else cout << v[i]; } cout << endl; } vector> prime; void prime_factors(ll a){ for (ll i = 2; i * i <= a; i++) { int cnt = 0; while(a % i == 0) { a /= i; cnt++; } if (cnt) { prime.pb(mp(i, cnt)); } } if(a != 1){ prime.pb(mp(a, 1)); } return; } ll pow_mod(ll a, ll b, ll m){ ll ret = 1; while (b > 0) { if (b & 1) { ret = ret * a % m; } a = a * a % m; b >>= 1; } return ret; } int main() { cin.tie(0); ios::sync_with_stdio(0); // source code int N, K; cin >> N >> K; vector A(N); rep(i, N) { cin >> A[i]; prime_factors(A[i]); } sort(all(prime)); reverse(all(prime)); prime.pb(mp(1, 1)); ll now = 0; ll ind = 0; ll cnt = 0; ll ret = 1; rep(i, prime.size()){ if (ind >= K) { while(prime[i].first == now) i++; (ret *= pow_mod(now, cnt, mod)) %= mod; now = prime[i].first; cnt = prime[i].second; ind = 1; continue; } if (now != prime[i].first) { (ret *= pow_mod(now, cnt, mod)) %= mod; now = prime[i].first; cnt = prime[i].second; ind = 1; } else { cnt += prime[i].second; ind++; } } output(ret, 0); return 0; }