알고리즘 설명
연습 문제 : https://www.acmicpc.net/problem/5615
5615번: 아파트 임대
첫째 줄에 아파트의 면적의 수 N이 주어진다. 다음 줄부터 N개 줄에 카탈로그에 적혀있는 순서대로 면적이 주어진다. N은 100,000이하이고 면적은 231-1이하인 양의 정수이다.
www.acmicpc.net
소스코드
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include <stdio.h>
#define NMAX 7
#define lint unsigned long long int
int N, cnt;
lint K;
int prime[NMAX] = {2, 3, 5, 7, 11, 13, 17};
lint pow(lint x, lint k, lint p) {
if(k == 0) return 1;
else if(k == 1) return x;
else {
if(k%2 == 0) return pow((x*x)%p, k/2, p);
else return (pow((x*x)%p, k/2, p)*x)%p;
}
}
// 소수인지 판단
bool isPrime(lint p) {
lint a, s, r;
for(int i=0;i<NMAX;i++) {
if(p%prime[i] == 0) return 1;
a = prime[i];
s = p-1; // s = d*2^k
while(1) {
r = pow(a, s, p)%p;
// a^s % p = -1
if(r == p-1) break;
else {
if(s%2 == 0) s /= 2;
else {
// a^d % p = 1 or -1 >> 소수
if(r == 1 or r == p-1) break;
else return 0;
}
}
}
}
return 1;
}
int main() {
scanf("%d", &N);
while(N--) {
scanf("%lld", &K);
K = K*2+1;
if( K==2 or (K%2==1 and isPrime(K)) ) cnt++;
}
printf("%d", cnt);
}
|
cs |
참고 자료
위키피디아 : https://ko.wikipedia.org/wiki/밀러-라빈_소수판별법
밀러-라빈 소수판별법 - 위키백과, 우리 모두의 백과사전
밀러-라빈 소수판별법(Miller-Rabin primality test)은 입력으로 주어진 수가 소수인지 아닌지 판별하는 알고리즘이다. 라빈-밀러 소수판별법(Rabin-Miller primality test)이라고도 한다. 개리 L. 밀러의 원래
ko.wikipedia.org
블로그 : https://freshrimpsushi.github.io/posts/miller-rabin-test/
밀러-라빈 판정법
Miller rabin test
freshrimpsushi.github.io
'Study' 카테고리의 다른 글
모듈로 곱셈 역원_팩토리얼 계산( BOJ 13977 ) (0) | 2022.07.11 |
---|---|
정렬 시간 비교 (0) | 2022.04.09 |
순열 알고리즘 (0) | 2021.10.01 |
Manacher's Algorithm (0) | 2021.05.27 |
Fenwick Tree( BIT ) (0) | 2021.03.16 |