| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 생능출판
- 백준
- 이득우
- C#
- 입출력과 사칙연산
- 밑바닥부터 만드는 컴퓨팅 시스템 2판
- 잡생각 정리글
- HANBIT Academy
- 주우석
- 이득우의 게임수학
- BOJ
- https://insightbook.co.kr/
- Shimon Schocken
- 알고리즘
- 메타버스
- 전공자를 위한 C언어 프로그래밍
- 박기현
- unity6
- C
- 데이터 통신과 컴퓨터 네트워크
- hanbit.co.kr
- 김진홍 옮김
- The Elements of Computing Systems 2/E
- (주)책만
- C++
- booksr.co.kr
- 일기
- JavaScript
- Noam Nisan
- 게임 수학
Archives
- Today
- Total
cyphen156
백준-약수, 배수와 소수 2단계 4134 다음 소수 본문
주어진 수보다 크고 인접한 가장 작은 소수를 하나씩 출력한다.
매우 큰 범위의 소수가 도출될 수 있다.
-> 일반적인 방법론 사용 불가능
--> 확률론적 방법론 사용
// 밀러 - 라빈 소수 판정법 사용
제약사항
- 0 <= N <= 4*10**9 == 약 40억
주의 사항
꼭 한번 더 보고 이해해보기CPP풀이
다음 소수_4134.cpp
/**
* 백준 다음 소수_4134
* 주어진 수보다 크고 인접한 가장 작은 소수를 하나씩 출력한다.
*
* 매우 큰 범위의 소수가 도출될 수 있다.
* -> 일반적인 방법론 사용 불가능
* --> 확률론적 방법론 사용
* // 밀러 - 라빈 소수 판정법 사용
* 메모이제이션 사용
*
* 제한사항
*****************************************
* 0 <= N <= 4*10**9 == 약 40억 *
*****************************************
*
*
*
* 주의
* 꼭 다시 한번 더 보고 이해해보기
*
* 풀이시간 120분
*/
#include <iostream>
typedef unsigned long long ull;
using namespace std;
// 거듭제곱 연산을 통해 합성수인지 판단
ull ModuloPower(ull base, ull exponent, ull modulos);
// 밀러-라빈 소수 판정기
bool IsPrime(unsigned int n);
// 나보다 큰 최인접소수 찾기
unsigned int FindNextPrime(unsigned int input);
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
for (int i = 0; i < N; ++i)
{
unsigned int input;
cin >> input;
cout << FindNextPrime(input) << '\n';
}
return 0;
}
// 지수 연산
ull ModuloPower(ull base, ull exponent, ull modulos)
{
ull result = 1;
base %= modulos;
while(exponent > 0)
{
if (exponent & 1)
{
result = (result * base) % modulos;
}
exponent >>= 1;
base = (base * base) % modulos;
}
return result;
}
// 실제 소수 판정
bool IsPrime(unsigned int n)
{
// 예외 처리부
if (n < 2)
{
return false;
}
if (n == 2 || n == 3)
{
return true;
}
if (n % 2 == 0)
{
return false;
}
// n-1 = d * 2^r 꼴로 분해
unsigned int d = n - 1;
int r = 0;
while ((d & 1) == 0)
{
d >>= 1;
r++;
}
// 밑
unsigned int bases[3] = {2, 7, 61};
for (int a : bases)
{
// 예외처리
if (a >= n)
{
continue;
}
long long x = ModuloPower(a, d, n);
if (x == 1 || x == n - 1)
{
continue;
}
bool isPassed = false;
for (int i = 1; i < r; i++)
{
x = ModuloPower(x, 2, n);
if (x == n - 1)
{
isPassed = true;
break;
}
}
if (!isPassed)
{
return false;
}
}
return true;
}
unsigned int FindNextPrime(unsigned int input)
{
if (input <= 2)
{
return 2;
}
// 만약 Input이 짝수라면 항상 합성수가 나올 테니 1을 올려서 홀수로 만들어서 소수 판별 시작
if (input % 2 == 0)
{
++input;
}
// 단순하게 2씩 늘려가면서 순회
while (!IsPrime(input))
{
input += 2;
}
return input;
}
모든 예제 코드의 소스파일은 제 개인 깃허브 레포지토리에 있습니다.
Workspace/알고리듬 풀이 at main · cyphen156/Workspace
Studying . Contribute to cyphen156/Workspace development by creating an account on GitHub.
github.com
'컴퓨터공학 > 알고리듬 풀이' 카테고리의 다른 글
| 백준-약수, 배수와 소수 2단계 4948 베르트랑 공준 (0) | 2025.06.09 |
|---|---|
| 백준-약수, 배수와 소수 2단계 1929 소수 구하기 (0) | 2025.06.09 |
| 백준-약수, 배수와 소수 2485 가로수 (1) | 2025.06.05 |
| 백준-약수, 배수와 소수 2단계 1735 분수합 (0) | 2025.06.04 |
| 백준-약수, 배수와 소수 2단계 13241 최소공배수 (0) | 2025.06.04 |