🖥️ 시작하며
수학 문제다.
처음에 반으로 나눴을 시 짝수일 때와, 홀수일 때 케이스를 나눠 풀었는데 등차수열의 합 공식을 알면 쉽게 풀린다.
- 등차수열의 합 공식: S = n(a₁ + aₙ) / 2
- 공차가 1이므로 aₙ = a₁ + (n - 1)
- S = n(a₁ + (a₁ + (n - 1))) / 2 S = n(2a₁ + n - 1) / 2
- S = na₁ + n(n-1)/2
- a₁ = (S - n(n-1)/2) / n
⇒ start = (N - length * (length - 1) / 2) / length
⚙️ 코드
import sys input = sys.stdin.readline def Solution(N, L): for i in range(L, 101): target = N // i if i % 2 == 0: # i가 짝수일 시 if (target + target + 1) * i // 2 == N: if target - (i // 2) + 1 < 0: continue return [target + i for i in range(-(i // 2) + 1, i // 2 + 1)] else: if target * i == N: if target - (i // 2) < 0: continue return [target + i for i in range(-(i // 2), i // 2 + 1)] return -1 if __name__ == "__main__": N, L = map(int, input().split()) result = Solution(N, L) if result == -1: print(-1) else: print(*result)
# 등차수열의 합 풀이 import sys input = sys.stdin.readline def Solution(N, L): for length in range(L, 101): # L부터 100까지만 검사 start = (N - (length * (length - 1) // 2)) // length if start < 0: continue if start * length + (length * (length - 1) // 2) == N: return [start + i for i in range(length)] return -1 if __name__ == "__main__": N, L = map(int, input().split()) result = Solution(N, L) if result == -1: print(-1) else: print(*result)
#include <stdio.h> int main() { long long N; int L; scanf("%lld %d", &N, &L); // 길이를 L부터 100까지 증가시키며 반복 for (long long length = L; length <= 100; length++) { // 시작 숫자를 계산 (등차수열 합 공식) long long start = (N - length * (length - 1) / 2) / length; if (start < 0) continue; // 시작 숫자가 음수면 다음 길이로 // 계산된 시작 숫자로 등차수열의 합을 확인 if (start * length + length * (length - 1) / 2 == N) { // 만족한다면 출력 for (int i = 0; i < length; i++) { printf("%lld ", start + i); } printf("\n"); return 0; } } printf("-1\n"); return 0; }
📌 소감
역시 수학을 열심히 공부해야 한다.
댓글