結果
| 問題 | No.368 LCM of K-products | 
| コンテスト | |
| ユーザー |  shora_kujira16 | 
| 提出日時 | 2016-04-29 23:23:36 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 372 ms / 2,000 ms | 
| コード長 | 1,504 bytes | 
| コンパイル時間 | 1,962 ms | 
| コンパイル使用メモリ | 189,056 KB | 
| 実行使用メモリ | 6,944 KB | 
| 最終ジャッジ日時 | 2024-09-22 14:43:18 | 
| 合計ジャッジ時間 | 4,881 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 35 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
#define DEBUG(x) cerr << #x << " = " << x << endl
constexpr int MOD = 1000000007;
int pow_mod(int x, int y) {
  int res = 1;
  for(; y > 0; y >>= 1, (x *= x) %= MOD) {
    if(y & 1) (res *= x) %= MOD;
  }
  return res;
}
template<class T, class U>
U get_or_else(const std::map<T, U> m, const T key, const U def) {
  auto it = m.find(key);
  if(it == m.end()) {
    return def;
  }
  else {
    return it->second;
  }
}
signed main() {
  int N, K; cin >> N >> K;
  vector<int> A(N);
  REP(i,N) cin >> A[i];
  vector<map<int, int>> factors(N);
  vector<int> allfactors;
  REP(i,N) {
    int num = A[i];
    while(num > 1) {
      bool div = false;
      for(int k = 2; k * k <= num; ++k) {
        if(num % k == 0) {
          factors[i][k]++;
          allfactors.push_back(k);
          num /= k;
          div = true;
          break;
        }
      }
      if(!div) {
        factors[i][num]++;
        allfactors.push_back(num);
        break;
      }
    }
  }
  sort(allfactors.begin(), allfactors.end());
  allfactors.erase(unique(allfactors.begin(), allfactors.end()), allfactors.end());
  int ans = 1;
  for(int fact : allfactors) {
    vector<int> cnt;
    REP(i,N) {
      cnt.push_back(get_or_else(factors[i], fact, 0LL));
    }
    sort(cnt.rbegin(), cnt.rend());
    REP(j,K) {
      ans *= pow_mod(fact, cnt[j]);
      ans %= MOD;
    }
  }
  cout << ans << endl;
}
            
            
            
        