문제 출처
1. 문제설명
- 두 끈을 이어붙이고, 그 끈을 다시 길이가 소수인 두 개의 끈으로 나눌 수 있는가?
2. 알고리즘 설계
- 이 문제는 골드바흐의 추측과 밀접한 관계가 있다.
- 이 추측에 의하면 4보다 큰 홀수는 두 홀수의 짝수 조합으로 나눌 수 있다.
- 즉, 두 수의 합이 4보다 작으면 절대 불가능하다.
- 4보다 큰 짝수 중에 소수는 없을까?
3. 로직
- 4보다 큰 짝수 소수인지 체크하는 방법
- 소수 중에 짝수는 2 뿐이다.
- 다시 말해서,
- 어떤 수에서 2를 뺀 다음,
- 이 수가 소수로 나눠지지 않는다면?
- 해당 숫자는 소수이다.
4. 전체 코드
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
vector<ll> v;
const int SZ = 2000001;
bool arr[SZ];
void eratos() {
arr[1] = true;
for (int i = 2; i * i < SZ; i++) {
if (arr[i]) continue;
for (int j = i * i; j < SZ; j += i)
arr[j] = true;
}
for (int i = 2; i < SZ; i++)
if (!arr[i])
v.push_back((ll)i);
}
bool is_prime(ll num) {
bool ret = true;
for (ll cur : v) {
if (num <= cur) break;
if (num % cur == 0) {
ret = false;
break;
}
}
return ret;
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
eratos();
int TC; cin >> TC;
while (TC--) {
ll a, b, s; cin >> a >> b;
s = a + b;
if (s <= 3) cout << "NO";
else if (s % 2 == 0) cout << "YES";
else {
if (is_prime(s - 2)) cout << "YES";
else cout << "NO";
}
cout << '\n';
}
return 0;
}
5. 주의!
- 골드바흐의 추측은,
- 아주 큰 범위의 수까지는 해당 이론이 적용된다고 한다.
- $2*10^2$ 까지는 적용이 되지 않는다.
- 따라서,
sqrt
($2*10^2$)까지의 소수만 계산한다.