PS/백준

[BOJ] 백준 18821번 : 홀수와 짝수의 대결 (JAVA)

제이온 (Jayon) 2020. 5. 3.

문제의 링크 : https://www.acmicpc.net/problem/18821

 

18821번: 홀수와 짝수의 대결

첫째 줄에는 테스트케이스의 개수 T(0 이상 1,000,000 이하)가 주어진다. 각각의 테스트케이스는 한 줄로 이루어져 있으며, 그 줄에 1 이상 109 이하의 자연수 n이 주어진다.

www.acmicpc.net

문제

일반적인 정의와 달리 이 문제에서는 홀수와 짝수를 다음과 같이 정의한다.

1 이상의 자연수 k는 소수의 곱으로 표현할 수 있고, 그 표현 방법은 소수의 순서를 바꾸는 경우를 제외하면 유일하다. 이때 사용된 소수의 개수가 2의 배수가 아니면 k는 짝수, 아니면 k는 홀수이다. (k = 1일 때는 소수 0개의 곱이고, 0은 2의 배수이다.) 같은 소수가 여러 번 사용되었을 경우, 사용될 때마다 하나씩 세어야 한다.

풀이

처음에는 1일 때만 E이고, 나머지는 O가 나오는 것 같아서 그대로 제출해 보았더니, 섭테2만 통과하였습니다. 이게 도대체 뭘까하고 구글링을 하다보니 폴리아 추측이라는 이론을 알게 되었습니다.

이것에 대한 이론은 https://en.wikipedia.org/wiki/P%C3%B3lya_conjecture 에서 참고하실 수 있고, 간단히 설명드리자면, 위 문제에서 E와 O를 만족하는 조건은 9억 이하까지만 해당이 되고, 그 이후로는 반례가 존재합니다.

따라서 1부터 10억까지 브루트포스를 돌리시면서 반례가 생기는 구간을 출력한 다음, 그 값을 따로 배열에 저장하여 예외 처리를 하면 됩니다.

소스 코드

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
60
61
62
63
64
65
66
67
68
69
 
public class Main {
    static int[][] a = { { 906150257906150258 }, { 906150259906150293 }, { 906150295906150307 },
            { 906150311906150313 }, { 906150315906151515 }, { 906151517906151575 }, { 906154583906154585 },
            { 906154605906154605 }, { 906154609906154757 }, { 906154763906154763 }, { 906154769906154769 },
            { 906154789906154789 }, { 906154791906154791 }, { 906154793906154793 }, { 906154825906154825 },
            { 906154829906154829 }, { 906154837906154837 }, { 906154857906154857 }, { 906154865906154881 },
            { 906154885906154885 }, { 906154887906154887 }, { 906154889906154889 }, { 906154891906154891 },
            { 906154893906154893 }, { 906154895906154907 }, { 906154909906154911 }, { 906154915906154927 },
            { 906154947906154949 }, { 906180359906180361 }, { 906180363906180363 }, { 906180365906180365 },
            { 906180367906180369 }, { 906180371906180373 }, { 906180375906180375 }, { 906180391906180517 },
            { 906180519906180519 }, { 906180525906180533 }, { 906180537906180553 }, { 906180555906192697 },
            { 906192847906192865 }, { 906192867906192903 }, { 906192905906192905 }, { 906192907906192965 },
            { 906192971906192971 }, { 906192979906192983 }, { 906192985906193227 }, { 906193229906193233 },
            { 906193245906193245 }, { 906193247906193247 }, { 906193303906193303 }, { 906193419906193419 },
            { 906193465906193465 }, { 906193475906193475 }, { 906193477906193477 }, { 906194931906194931 },
            { 906194933906194945 }, { 906194949906194949 }, { 906194951906194967 }, { 906194979906194979 },
            { 906195099906195099 }, { 906195109906195149 }, { 906195151906195151 }, { 906195297906195297 },
            { 906195299906195985 }, { 906195989906195989 }, { 906196009906196009 }, { 906196011906196013 },
            { 906196015906196015 }, { 906196045906196051 }, { 906196053906196055 }, { 906196057906196071 },
            { 906196077906196079 }, { 906196081906196081 }, { 906196083906196091 }, { 906196099906208711 },
            { 906208713906208713 }, { 906208731906208731 }, { 906209041906209063 }, { 906209067906209067 },
            { 906209069906209069 }, { 906209071906209223 }, { 906209227906209227 }, { 906209233906209235 },
            { 906209237906209237 }, { 906209241906209241 }, { 906209243906209271 }, { 906209283906209283 },
            { 906209285906477701 }, { 906477735906477811 }, { 906477867906477867 }, { 906477869906477869 },
            { 906477871906477899 }, { 906477901906477901 }, { 906477903906477905 }, { 906477929906477931 },
            { 906477933906477933 }, { 906477935906477935 }, { 906477937906486639 }, { 906486805906486805 },
            { 906486807906486807 }, { 906486817906486817 }, { 906486819906486819 }, { 906486821906486831 },
            { 906486843906486853 }, { 906486855906486855 }, { 906486909906486913 }, { 906486917906486973 },
            { 906486975906487001 }, { 906487005906487063 }, { 906487065906487065 }, { 906487069906487069 },
            { 906487071906487071 }, { 906487073906487077 }, { 906487085906487085 }, { 906487087906487101 },
            { 906487185906487185 }, { 906487187906487189 }, { 906487191906487191 }, { 906487193906487193 },
            { 906487195906487203 }, { 906487205906487205 }, { 906487259906487259 }, { 906487261906487261 },
            { 906487263906487263 }, { 906487271906487287 }, { 906487933906487933 }, { 906487937906487937 },
            { 906487949906487973 }, { 906487975906487993 }, { 906487995906488001 }, { 906488003906488003 },
            { 906488007906488007 }, { 906488009906488009 }, { 906488023906488025 }, { 906488027906488065 },
            { 906488067906488067 }, { 906488077906488079 } };
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int T = Integer.parseInt(br.readLine());
        while (T-- > 0) {
            int n = Integer.parseInt(br.readLine());
            boolean polya = false;
            for (int i = 0; i < 137; i++) {
                if (a[i][0<= n && n <= a[i][1]) {
                    polya = true;
                    break;
                }
            }
 
            if (n == 1 || polya) {
                bw.write("E\n");
            } else {
                bw.write("O\n");
            }
        }
        
        bw.flush();
        bw.close();
        br.close();
    }
 
}
 
cs

 

지적 혹은 조언 환영합니다! 언제든지 댓글로 남겨주세요.

댓글

추천 글