Develop & CS/Baekjoon

[Baekjoon] [11690 : LCM(1, 2, ..., n)]

2022. 7. 6. 20:37
반응형

이번 문제는 11690번 LCM(1, 2, ..., n)입니다.

 

문제는

https://www.acmicpc.net/problem/11690

 

11690번: LCM(1, 2, ..., n)

첫째 줄에 1보다 크거나 같고, n보다 작거나 같은 모든 자연수의 최소공배수를 출력한다. 정답이 매우 커질 수 있기 때문에, 232로 나눈 나머지를 출력한다.

www.acmicpc.net

다음과 같습니다.

 

문제를 해결하기 위해서..

입력받은 수보다 낮은 소수들의 거듭제곱의 최대들만 곱하면 LCM이 되리라 생각하고

 

중복을 막고자 마지막에서 여러 쌩쇼를 했고

int 배열의 최대 사이즈가 10^7이기에 입력인 10^8을 커버하고자 vector까지 써봤는데요.

 

이번에는 메모리 초과로 나타나서 안 되더군요

#include<stdio.h>
#include<vector>

using namespace std;

//int arr[10000001] = {1,1};
vector <int> arr(100000000);
int main(void)
{
    for(long long int i = 2; i<10000; i++)
    {
        if(arr[i] == 0)
        {
            for(long long int j = i*i; j<100000000; j+=i)
            {
                arr[j] = 1;    
            }
            for(long long int j = i*i; j<100000000; j*=i)
            {
                arr[j] = i;
            }
        }
    }

    unsigned long long int d = (unsigned long long int) 1<<32;
    unsigned long long int n, lcm=1;
    
    scanf("%llu",&n);

    // for(long long int i = 1; i<1000; i++)
    // {
    //     printf("%d ", arr[i]);
    //     if(i%10 == 0)
    //     {
    //         printf("\n");
    //     }
    // }

    for(long long int i = n; i>=2; i--)
    {
        if(arr[i] != 1) //0 : prime, 1: not prime, else : nearly prime
        {
            if(arr[arr[i]] == 0 && arr[i] != 0) //nearly prime
            {
                // printf("i : %llu lcm : %llu, arr[i] : %d arr[arr[i]] : %d\n\n",i,lcm,arr[i],arr[arr[i]]);
                lcm *= i;
                arr[arr[i]] = 1;
            }
            else if(arr[i] == 0) // prime
            {
                // printf("i : %llu lcm : %llu, arr[i] : %d arr[arr[i]] : %d\n\n",i,lcm,arr[i],arr[arr[i]]);
                lcm *= i;
                arr[i] = 1;
            }
        }
    }

    printf("%llu",lcm%d);

    return 0;
}

 

그래서 다른 방법을 생각해보기로 했습니다.

 

..

배열을 그냥 통짜로 가져오면 아무래도 메모리가 많이 소요되는 것 같아

소수만 뽑아서 가져오고

하나의 소수에 대해서 n보다 작은 동안 n제곱하여 해당하는 소수의 거듭제곱을 찾겠습니다.

 

범위를 위해서 벡터를 써야하고..

 

#include<stdio.h>
#include<vector>

using namespace std;

vector<int> prime;
bool arr[100000001];

int main(void)
{
    long long int mod = (long long int) 1<<32;
    unsigned long long int n;
    unsigned long long int lcm = 1;

    scanf("%llu",&n);

    arr[0] = 1;
    arr[1] = 1;

    for(long long int i=2; i<100000001; i++)
    {
        if(arr[i] == 0)
        {
            prime.push_back(i);
            for(long long int j=i*i; j<100000001; j+=i)
            {
                arr[j] = 1;
            }
        }
    }

    for(int i=0; i<prime.size(); i++)
    {
        unsigned long long int cnt=1;
        while(prime[i]*cnt <= n)
        {
            //printf("prime i : %d\n",prime[i]);
            cnt *= prime[i];
        }
        lcm *= cnt;
    }
    
    printf("%llu",lcm%mod);

    return 0;
}

 

그냥 에라토스테네스의 체에서 i범위를 늘려도 에러가 안나네요?

그래야 필요한 소수를 다 받을 수 있어서 이렇게 만들어줍니다~

 

끗

 

https://2heedu.tistory.com/53

 

배열 최대 크기

전역변수로 배열의 크기를 선언하는 경우가 많다. 문제의 최대값에 의해 배열 크기가 달라질 것이다. 이때 최대 크기 때문에 풀이가 달라지는 경우가 많다. char 배열 최대 크기 : 약 백만 문제에

2heedu.tistory.com

배열의 최대 크기에 관한 글입니다.

char 배열 최대 크기 : 약 백만

문제에서 최대 범위가 백만까지 주어질 경우 사용 가능

 

int 배열 최대 크기 : 약 이십오만

문제에서 최대 범위가 이십오만까지 주어질 경우 사용 가능

 

vector의 push_back 최대 크기 : 약 십억 

문제에서 최대 범위가 십억까지 주어질 경우 사용 가능

 

반응형
'Develop & CS/Baekjoon' 카테고리의 다른 글
  • [Baekjoon] [7569 : 토마토] C++ 풀이
  • [Baekjoon] [1654 : 랜선자르기] 이진탐색과 문제풀이
  • [Baekjoon] [1456 : 거의 소수]
  • [Baekjoon] [1188 : 음식 평론가]
그믐​
그믐​
그믐​
neutrinox4b1
그믐​
전체
오늘
어제
  • 분류 전체보기 (288)
    • Write up (Wargame) (121)
      • Pwnable (60)
      • Reversing (0)
      • Web Hacking (8)
      • Forensic (1)
      • Cryptography (6)
      • LOB (10)
      • misc (0)
      • SF pwnable 기초 (10)
      • SF pwnable 심화 (1)
      • LOS (25)
    • Security (73)
      • 시스템 해킹(PWN, System) (21)
      • 리버싱(Reverse Engineering) (1)
      • 포렌식(Forensic) (3)
      • 암호학(Cryptography) (44)
      • 네트워크(Network) (1)
      • 임베디드(Emebedded) (0)
    • Develop & CS (38)
      • Algorithm & Data Structure (6)
      • Baekjoon (11)
      • C, C++ (8)
      • Python (2)
      • R (1)
      • etc (8)
    • 프로젝트(Project) (7)
      • 시간표&급식 파싱 (1)
      • 남방진동지수 (1)
      • 네트워크 해킹 (5)
    • Daily life (44)
      • My Book (10)
      • Book Review (1)
      • IT Review (1)
      • 일상 팁 (19)
      • 네트워크관리사 (2)
      • 근황 (11)
    • 수학&과학(Mathematics & Science.. (4)

인기 글

공지사항

  • Wargame, CTF별 검색 키워드 정리
hELLO · Designed By 정상우.
그믐​
[Baekjoon] [11690 : LCM(1, 2, ..., n)]
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.