알고리즘문제풀이

백준 1419 등차수열의 합

배우겠습니다 2024. 3. 6. 16:14

문제

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

 

1419번: 등차수열의 합

첫 항이 x이고 공차가 d인 등차수열의 첫 k개의 항은 x, x+d, x+2d, ..., x+(k-1)d이다. x와 d가 자연수인 등차수열의 첫 k개의 항의 합으로 나타낼 수 있는 수 중에서, l 이상이고 r 이하인 수가 몇 개인지

www.acmicpc.net

 

풀이

l <= Kx + d * K * (K - 1) / 2 <= r 을 만족해야한다.

K의 범위가 좁으므로 하나씩 생각할 수 있다.

 Kx + d * K * (K - 1) / 2 에 K = 2,3,4,5를 넣어주자.

1. K = 2

l <= 2x + d <= r

2x + d는 3이상 자연수이다.

2. K = 3

l <= 3(x+d) <= r

3(x+d)는 6이상 3의 배수이다.

3. K = 4

이게 좀 더럽다.

4x + 6d 

이해를 위해 x와 d에 수 몇개를 넣어보자.

X\D 1 2 3
1 10 16 22
2 14 20 26
3 18 24 30

4 < 6이므로 4x + 6d에서 4x부분은 6d의 나머지가 될 것이다.

4x % 6는 0,2,4가 나올 수 있다.(12%6,8%6,4%6)

따라서 4x+6d는 10이상 6으로 나눴을때 나머지가 4인 자연수 or 14이상 6으로 나눴을때 나머지가 2인 자연수 or 18이상 6의 배수이다.

 

4. K = 5

5x + 10d

5(x+2d)

2x+d가 3이상 자연수이므로 x+2d도 3이상 자연수이다.

따라서 5(x+2d)는 15이상 5의 배수이다.

 

# L~R까지 K의 배수를 구하는 법
# 만약에 나머지가 나올 경우 나머지를 올려 다음배수를 보도록 한다. 정수 나눗셈은 버림연산이기 때문이다.
X = L // K if K % K == 0 else 1 + L // K 
Y = R // K
diff = Y - X + 1

 

# L~R까지 K로 나눴을 때 나머지가 REST인 수를 구하는 법
# L과 R을 Kq + REST꼴로 바꾼다. 
# L은 + R은 -해줘야 범위를 안벗어난다.
lr = L % K
L += REST - lr if REST >= lr else K + REST - lr
rr = R % K
R -= rr - REST if REST <= rr else rr + K - REST
# 이를 쉬프트 시킨다.
L -= REST
R -= REST
# 이제 K의 배수 개수를 구하는 코드를 L,R에 적용
X = L // K if K % K == 0 else 1 + L // K 
Y = R // K
diff = Y - X + 1

 

'알고리즘문제풀이' 카테고리의 다른 글

2381 최대거리  (1) 2024.03.24
31478 포니 양은 놀고 싶어  (2) 2024.03.22
백준 31443 준영이  (0) 2024.03.06
프로그래머스 숫자 카드 나누기  (0) 2024.02.26
프로그래머스 유사 칸토어 비트열  (0) 2024.02.25