๋ฌธ์
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์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด์ ์ฃผ์ด์ง n์ ๊ณจ๋๋ฐํ ํํฐ์ ์ ์ถ๋ ฅํ๋ค. ์ถ๋ ฅํ๋ ์์๋ ์์ ๊ฒ๋ถํฐ ๋จผ์ ์ถ๋ ฅํ๋ฉฐ, ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ๋ค.
์ ํ
4 ≤ n ≤ 10,000
์์ ์ ๋ ฅ 1
3
8
10
16
์์ ์ถ๋ ฅ 1
3 5
5 5
5 11
ํ์ด
์ซ์ n์ด ์ฃผ์ด์ก์ ๋ n/2์์ ํ๋์ฉ ๋ํ๊ณ ๋นผ๋ฉฐ ๋ ์ ๋ชจ๋ ์์์ธ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ผ๋ฉด ๋ ์์ ์ฐจ๊ฐ ๊ฐ์ฅ ์๋ค.
( 8์ผ๋ 4, 4 -> 3, 5 / 10์ผ๋ 5, 5 / 16์ผ๋ 8, 8 -> 7, 9 -> 6, 10 -> 5, 11)
1. ์ซ์๋ฅผ ์ ๋ ฅ๋ฐ์ผ๋ฉด ์์์ธ์ง ์๋์ง ์๋ ค์ฃผ๋ ํจ์๋ฅผ ์์ฑ
1-1. 1 ~ 10000 ์ฌ์ด์ ๋ชจ๋ ์์๊ฐ ์ ์ฅ๋ prime ๋ฐฐ์ด, prime๋ฐฐ์ด์ ๊ธธ์ด primeIdx, ์์ ์ฌ๋ถ๋ฅผ ๊ตฌ๋ถํ ์ซ์ num์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ ฅ
1-2. ์์์ผ ๋ ํด๋น ์์์ prime ๋ฐฐ์ด index๋ฅผ, ์์๊ฐ ์๋๋ -1์ ๋ฐํ
2. ์ซ์ n์ ์ ๋ ฅ๋ฐ์ผ๋ฉด (n/2 -i, n/2 +i) (i ๋ 0๋ถํฐ n/2๊น์ง) ์์์ธ์ง ์๋์ง ํ๋จ
3. ๋๋ค ์์์ผ ๊ฒฝ์ฐ ์ถ๋ ฅ
import java.io.*;
import java.util.Scanner;
public class B9020 {
static int isPrime(int[] a, int length, int num) {
for(int i = 0; i < length; i++) {
if(a[i]==num)
return i;
}
return -1;
}
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = sc.nextInt();
int prime[] = new int[1300];
int primeIdx = 1;
prime[0] = 2;
prime[1] = 3;
Loop1 :
for(int i = 4; i <= 10000; i++) {
for(int j = 0; j < primeIdx; j++) {
if(i % prime[j] == 0) {
continue Loop1;
} else {
}
}
prime[++primeIdx] = i;
}
for(int i = 0; i < t; i++) {
int n = sc.nextInt();
int num1 = -1;
int num2 = -1;
for(int j = 0; j < n / 2; j++) {
num1 = isPrime(prime, primeIdx, (n/2)-j);
num2 = isPrime(prime, primeIdx, (n/2)+j);
if ( num1 != -1 && num2 != -1) {
break;
}
}
bw.write(prime[num1] + " " + prime[num2]);
bw.newLine();
}
bw.flush();
}
}