아레나레이팅

solved.ac Grand Arena #2

풀이 1

문제에서 주어진대로 반복문을 통해 구현합니다. 시간복잡도는 O(N)\mathcal O (N)입니다.

코드 (C++)

#include <iostream> using namespace std; int main() { int N; cin >> N; int sum_1 = 0, sum_3 = 0; for (int i = 1; i <= N; i++) { sum_1 += i; sum_3 += i * i * i; } cout << sum_1 << endl; cout << sum_1 * sum_1 << endl; cout << sum_3 << endl; }

코드 (Python)

def main(): N = int(input()) print(sum(range(1, N+1))) print(sum(range(1, N+1))**2) print(sum(i**3 for i in range(1, N+1))) if __name__ == '__main__': main()

풀이 2

1+2++N=N(N+1)21+2+\cdots+N = \frac{N(N+1)}{2}가 성립합니다. 또한, 13+23++N3=(1+2++N)2=(N(N+1)2)21^3 + 2^3 + \cdots + N^3 = (1+2+\cdots+N)^2 = {\left(\frac{N(N+1)}{2}\right)}^2이 성립합니다. 시간복잡도는 O(1)\mathcal O (1)입니다.

코드 (C++)

#include <iostream> using namespace std; int main() { int N; cin >> N; cout << N * (N + 1) / 2 << endl; cout << (N * (N + 1) / 2) * (N * (N + 1) / 2) << endl; cout << (N * (N + 1) / 2) * (N * (N + 1) / 2) << endl; }

코드 (Python)

def main(): N = int(input()) print(N * (N + 1) // 2) print((N * (N + 1) // 2) ** 2) print((N * (N + 1) // 2) ** 2) if __name__ == '__main__': main()

증명

우선, 1+2++N=N(N+1)21+2+\cdots+N = \frac{N(N+1)}{2}를 증명하기 위해 2×(1+2++N)2 \times (1 + 2+ \cdots + N)를 계산해봅시다.

(1+2++N)(1+2+\cdots+N) 두 개를 더할 때 하나는 그대로, 하나는 뒤집어서 더합시다. 이후 각 수를 살펴보면 11NN을 합쳐서 N+1N+1, 22N1N-1을 합쳐서 N+1N+1, \cdots, NN11을 합쳐서 N+1N+1이 되기 때문에 N+1N+1을 총 NN개 합한 N(N+1)N(N+1)과 같게 됩니다.

이를 수식으로 표현하면 다음과 같습니다.

 2×(1+2++N)= (1+2++N)+(N+(N1)++1)= ((1+N)+(2+(N1))++(N+1))= ((N+1)+(N+1)++(N+1))= N(N+1)\begin{align*} & \ 2 \times (1 + 2 + \cdots + N) \\ = & \ (1 + 2 + \cdots + N) + (N + (N-1) + \cdots + 1) \\ = & \ ((1+N) + (2+(N-1)) + \cdots + (N+1)) \\ = & \ ((N+1) + (N+1) + \cdots+ (N+1)) \\ = & \ N(N+1) \end{align*}

1+2+\cdots+N = \frac{N(N+1)}{2}의 시각적 증명

이제 조금 더 난이도가 있는 (1+2++N)2=13+23++N3(1+ 2+ \cdots + N)^2 = 1^3 + 2^3 + \cdots + N^3 을 증명해봅시다. 양변에 있는 두 식이 N=1N=1일 때 같은 값을 가지고 N=i1N=i-1N=iN=i일때 차이가 같아서, 결국 두 식이 같다는 것을 증명할 것입니다. N=1N = 1일 때는 두 식의 값이 모두 11로 같습니다. 이제, 두 식의 차이에 대해 살펴봅시다.

이제, (1+2++N)2(1+2+ \cdots+N)^2N=i1N=i-1N=iN=i일 때의 차는 다음과 같습니다. a2b2=(ab)(a+b)a^2-b^2 = (a-b)(a+b)임을 이용합시다.

 (1+2++i)2(1+2++(i1)2)= (i(i+1)2)2(i(i1)2)2= (i(i+1)2i(i1)2)×(i(i+1)2+i(i1)2)= (i((i+1)(i1))2)×(i((i+1)+(i1))2)= (i×22)×(i×2i2)= i×i2=i3\begin{align*} & \ (1+2+\cdots+i)^2 - (1+2+\cdots+(i-1)^2) \\ = & \ \left(\frac{i(i+1)}{2}\right)^2 - \left(\frac{i(i-1)}{2}\right)^2 \\ = & \ \left(\frac{i(i+1)}{2} - \frac{i(i-1)}{2}\right) \times \left(\frac{i(i+1)}{2} + \frac{i(i-1)}{2}\right) \\ = & \ \left(\frac{i((i+1)-(i-1))}{2}\right) \times \left(\frac{i((i+1)+(i-1))}{2}\right) \\ = & \ \left(\frac{i \times 2}{2} \right) \times \left(\frac{i \times 2i}{2} \right) \\ = & \ i \times i^2 = i^3 \end{align*}

13+23++(i1)3 1^3 + 2^3 + \cdots + (i-1)^313+23++i3 1^3 + 2^3 + \cdots + i^3의 차이도 i3i^3이므로, 두 식이 결국 같은 값임을 알 수 있습니다.

이 식을 시각적으로 증명하는 방법도 있습니다.

(1+2+\cdots+N)^2 = 1^3+2^3+\cdots+N^3의 시각적 증명