백준 11690 LCM(1, 2, ..., n)

치즈·2022년 12월 21일

BOJ

목록 보기
30/45

소수들의 N 이하 거듭제곱들 중 최댓값들의 곱으로 나타내기.

#include <cmath>
#include <iostream>
#include <vector>
using namespace std;

int N;
long long ans = 1;
long long BIG = pow(2, 32);
vector<bool> primes;
vector<int> v;

void getPrimes(int n) {
  for (int i = 2; i * i <= n; i++) {
    if (!primes[i])
      continue;
    for (int j = 2 * i; j <= n; j += i) {
      primes[j] = false;
    }
  }
}

void input() {
  cin >> N;
  primes.resize(N + 1, true);
}

void solve(){
  v.push_back(2);
  for(int i = 3; i <= N; i++){
    if(primes[i]) v.push_back(i);
  }
  long long  p;
  for(int i = 0; i < v.size(); i++){
    p = v[i];
    while(p * v[i] <= N){
      p *= v[i];
    }
    ans = (ans * p) % BIG;
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  input();
  getPrimes(N);
  solve();
  cout << ans % BIG;
  return 0;
}

profile
차근차근 배워나가요

0개의 댓글