πλ¬Έμ
1λ³΄λ€ ν° μμ°μ μ€μμ 1κ³Ό μκΈ° μμ μ μ μΈν μ½μκ° μλ μμ°μλ₯Ό μμλΌκ³ νλ€. μλ₯Ό λ€μ΄, 5λ 1κ³Ό 5λ₯Ό μ μΈν μ½μκ° μκΈ° λλ¬Έμ μμμ΄λ€. νμ§λ§, 6μ 6 = 2 × 3 μ΄κΈ° λλ¬Έμ μμκ° μλλ€.
골λλ°νμ μΆμΈ‘μ μ λͺ ν μ μλ‘ μ λ―Έν΄κ²° λ¬Έμ λ‘, 2λ³΄λ€ ν° λͺ¨λ μ§μλ λ μμμ ν©μΌλ‘ λνλΌ μ μλ€λ κ²μ΄λ€. μ΄λ¬ν μλ₯Ό 골λλ°ν μλΌκ³ νλ€. λ, μ§μλ₯Ό λ μμμ ν©μΌλ‘ λνλ΄λ ννμ κ·Έ μμ 골λλ°ν νν°μ μ΄λΌκ³ νλ€. μλ₯Ό λ€λ©΄, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7μ΄λ€. 10000λ³΄λ€ μκ±°λ κ°μ λͺ¨λ μ§μ nμ λν 골λλ°ν νν°μ μ μ‘΄μ¬νλ€.
2λ³΄λ€ ν° μ§μ nμ΄ μ£Όμ΄μ‘μ λ, nμ 골λλ°ν νν°μ μ μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±νμμ€. λ§μ½ κ°λ₯ν nμ 골λλ°ν νν°μ μ΄ μ¬λ¬ κ°μ§μΈ κ²½μ°μλ λ μμμ μ°¨μ΄κ° κ°μ₯ μμ κ²μ μΆλ ₯νλ€.
πμ λ ₯
첫째 μ€μ ν μ€νΈ μΌμ΄μ€μ κ°μ Tκ° μ£Όμ΄μ§λ€. κ° ν μ€νΈ μΌμ΄μ€λ ν μ€λ‘ μ΄λ£¨μ΄μ Έ μκ³ μ§μ nμ΄ μ£Όμ΄μ§λ€. (4 ≤ n ≤ 10,000)
π±π€μΆλ ₯
κ° ν μ€νΈ μΌμ΄μ€μ λν΄μ μ£Όμ΄μ§ nμ 골λλ°ν νν°μ μ μΆλ ₯νλ€. μΆλ ₯νλ μμλ μμ κ²λΆν° λ¨Όμ μΆλ ₯νλ©°, 곡백μΌλ‘ ꡬλΆνλ€.
π¬ μμ μ λ ₯
3
8
10
16
π¬ μμ μΆλ ₯
3 5
5 5
5 11
π λμ νμ΄
골λλ°ν μλ 2λ³΄λ€ ν° λͺ¨λ μ§μλ λ μμμ ν©μΌλ‘ λν λΌ μ μλ€.
μλ₯Ό λ€λ©΄, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7 μ΄λ€.
10000λ³΄λ€ μκ±°λ κ°μ λͺ¨λ μ§μ nμ λν 골λλ°ν νν°μ μ μ‘΄μ¬νλ€.
μΌλ¨ λ¨Όμ 'μλΌν μ€ν λ€μ€μ 체' λ₯Ό μ΄μ©ν΄μ μμλ₯Ό 10000 + 1 κΉμ§ κ΅¬ν΄ λλλ€.
//init
demical[0] = -1;
demical[1] = -1;
for (long i = 2; i < demical.length; i++) {
if (demical[(int) i] != -1) {
for (long j = i * i; j < demical.length; j += i) {
demical[(int) j] = -1;
}
}
}
쑰건 μ€μ λ§μ½ κ°λ₯ν nμ 골λλ°ν νν°μ μ΄ μ¬λ¬ κ°μ§μΈ κ²½μ°μλ λ μμμ μ°¨μ΄κ° κ°μ₯ μμ κ²μ μΆλ ₯νλ€.
μμ 쑰건μ λ§μ‘±νκΈ° μν΄μλ N / 2 λ₯Ό νμ¬ (1)N / 2 + (2)N / 2 = N μΌλ,
첫 λ²μ§Έλ‘ (1), (2) κ° λ λ€ μμμΈμ§ 체ν¬νκ³ , μμκ° μλλΌλ©΄ -> (1)μ -1 κ°μ μν€κ³ , (2)λ₯Ό +1 μ¦κ°μμΌμ
λ€μνλ² μμμΈμ§ μ²΄ν¬ ν΄λ³΄κ³ , μ΄ κ³Όμ μ λ°λ³΅μν¨λ€. λ§μ½ if(arr[--idx1] == 0 & arr[++idx2])λ₯Ό λ§μ‘±μν¬λ, μΆλ ₯μμΌμ£Όλ©΄ λλ€.
μ½λλ μλμ κ°λ€.
private static String method(int[] arr, int N) {
String answer = "";
int middle = N / 2;
if (arr[middle] == 0) { // μμ μΌλ?
return answer + middle + " " + middle;
} else { // μμκ° μλλ!
int idx1 = middle;
int idx2 = middle;
while (!(idx1 < 2 && idx2 < 2)) {
if (arr[--idx1] == 0 & arr[++idx2] == 0) { //λλ€ μμμΌλ
if (idx1 + idx2 == N) {
return answer + idx1 + " " + idx2;
}
}
}
}
return answer;
}
π΄μ 체 μ½λ
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] arr = new int[10001]; // μ΅λ N λ§νΌ λ°°μ΄ μμ±
int T = Integer.parseInt(bf.readLine());
// init : μλΌν μ€ν
λ€μ€μ 체
arr[0] = -1;
arr[1] = -1;
for (int i = 2; i < arr.length; i++) {
if(arr[i] != -1) {
for (int j = i * i; j < arr.length; j += i) {
arr[j] = -1;
}
}
}
for (int i = 0; i < T; i++) {
int N = Integer.parseInt(bf.readLine());
String result = method(arr, N);
bw.write(result + "\n");
}
bw.flush();
bw.close();
}
// ex) N:12 -> 6 + 6 -> 6μ΄ μμμΈκ°? -> μμκ° μλλ 5 + 7 .. 4 + 8 .. μ΄λ°μμΌλ‘ λΉκ΅νλ©΄μ κ³μ°
private static String method(int[] arr, int N) {
String answer = "";
int middle = N / 2;
if (arr[middle] == 0) { // μμ μΌλ?
return answer + middle + " " + middle;
} else { // μμκ° μλλ!
int idx1 = middle;
int idx2 = middle;
while (!(idx1 < 2 && idx2 < 2)) {
if (arr[--idx1] == 0 & arr[++idx2] == 0) { //λλ€ μμμΌλ
if (idx1 + idx2 == N) {
return answer + idx1 + " " + idx2;
}
}
}
}
return answer;
}
}