i + 2*j + 3*k = x 가 되는 {i,j,k} 쌍의 개수 찾기 ( i,j,k >= 0 , 1 <= x )
ex. x = 4 일 때 {4,0,0} , {2,1,0} , {1,0,1} , {0,2,0} 총 4가지
인데
저는 처음에 i = x 로 둔 뒤에, i를 1씩 빼가면서 {j,k} 쌍의 개수를 찾아서 전부 더하는 걸로 풀었음
i = x -> {0,0}
i = x-1 -> 불가능
i = x-2 -> {1,0}
...
i = 0 -> { j1, k1 } , {j2, k2} ... {jn, kn}
------------------------------------------- sum
i가 임의의 a 일 때 {j,k} 쌍 찾는 방법은
{최대 j, 최소 k} 를 구한 뒤에 { 최대 j - 3*n , 최소 k + 2*n } , j가 3감소하면 총 2*3 = 6 만큼 감소하니까 k를 2 증가시켜서 3*2 = 6 만큼 다시
증가시켜서 값을 유지시키는 방법
ex 처음 {최대j, 최소k} 가 { 10,1} 이었다면 { 10-3, 1+2 } , { 10-6, 1+4 } ... j가 음수가 되면 종료
식을 세우고 나니까 너무 복잡하고, 구현도 신경쓸 부분이 많은거임..
식 i + 2*j + 3*k = x 자체는 간단한데 너무 어렵게 푼거 같음. 좀 더 괜찮은 방법 있을까
1원 2원 3원짜리 동전으로 x원 만드는 거랑 똑같은 거 아님?
DP 될거같은데
i + 2j + 3k = x를 만족하는 (i, j, k)의 개수 = 2j + 3k <= x를 만족하는 (j, k) 개수
j가 정해졌을때 위 식을 만족하는 k의 개수는 \floor((x - 2j) / 3)개니까 각 j에 대해 다 더하면 됨.
이것보다 더 빠른것도 가능할것 같긴 한데 조금 더 복잡하긴 할듯
그냥 3개씩 묶어서 계산하면 O(1) 풀이도 가능함.
전형적인 dp. 1, 2, 3 더하기 참고하셈
팩트) 다른문제다
해당 댓글은 삭제되었습니다.
f(x) 왜 그렇게 나오는 거임?..
print(sum([(n-3*i)//2+1 for i in range(n//3)])) 파이썬 기준으론 이거일듯한데
아니다 range(n//3+1)로 정정