BOJ

백준 10448 - 유레카 이론

yanJuicy 2019. 5. 14. 22:08
반응형

문제

https://www.acmicpc.net/problem/10448

 

10448번: 유레카 이론

문제 삼각수 Tn(n ≥ 1)는 [그림]에서와 같이 기하학적으로 일정한 모양의 규칙을 갖는 점들의 모음으로 표현될 수 있다. [그림] 자연수 n에 대해 n ≥ 1의 삼각수Tn는 명백한 공식이 있다. Tn = 1 + 2 + 3 + ... + n = n(n+1)/2 1796년, 가우스는 모든 자연수가 최대 3개의 삼각수의 합으로 표현될 수 있다고 증명하였다. 예를 들어, 4 = T1 + T2 5 = T1 + T1 + T2 6 = T2 + T2 or 6 = T

www.acmicpc.net

 

풀이

K보다 작은 삼각수를 구해서 모두 구해서 합으로 표현가능한지 확인한다. 1000보다 작은 삼각수의 수는 생각보다 많지 않아서 가능하다.

 

1. K보다 작은 삼각수를 구한다

2. 3개씩 더하면서 합이 맞는지 확인한다.

 

코드

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
#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    int T;
    cin >> T;
 
    while (T--)
    {
        int K;
        cin >> K;
 
        vector<int> v;
        int i = 1;
        int plus = 2;
        while (i < K)
        {
            v.push_back(i);
            i += plus++;
        }
 
        i = 0;
        int j = 0, k = 0;
        int num1 = v[i], num2 = v[j], num3 = v[k];
        int result = 0;
 
        while (true)
        {
            if (num1 + num2 + num3 == K)
            {
                result = 1;
                break;
            }
 
            k++;
            if (k == v.size())
            {
                k = 0;
                j++;
                if (j == v.size())
                {
                    j = 0;
                    i++;
                    if (i == v.size()) 
                        break;
                }
            }
            num3 = v[k];
            num2 = v[j];
            num1 = v[i];
        }
 
        cout << result << '\n';
    }
 
 
    return 0;
}
 
cs

 

반응형

'BOJ' 카테고리의 다른 글

백준 1629 - 곱셈  (0) 2019.05.16
백준 9465 - 스티커  (0) 2019.05.14
백준 1463 - 1로 만들기  (0) 2019.05.12
백준 3085 - 사탕 게임  (0) 2019.05.12
백준 1912 - 연속합  (0) 2019.05.07