문제
28426번: 더하기와 나누기 (acmicpc.net)
28426번: 더하기와 나누기
다음 두 조건을 만족하는 길이 $N$의 수열 $A_1,A_2,\cdots,A_N$을 아무거나 하나 구해서 출력해 보자. 수열의 원소는 모두 다르고 $2$ 이상 $10^6$ 이하의 정수이다. $1$ 이상 $N$ 이하의 모든 정수 $i$에 대
www.acmicpc.net
풀이
다른말로하면, A의 원소는 sum(A)의 약수가 아니란 것이다.
해 구성하기가 사실 운빨이 중요하기도 하다 보긴하는데, 나같은경우는 기본형을 만들고 거기서 값을 변형/추가하며 정답을 도출한다.
홀수는 짝수의 약수가 될 수 있지만, 짝수는 홀수의 약수가 될 수 없다.
따라서 A를 2부터 2 + 2(N-1)의 짝수들로 우선 채워준다. A의 원소는 모두짝수이고 sum(A)를 홀수로 만들면 A의 원소는 sum(A)의 약수가 없을 것이다.(기본형: 2이상의 짝수가 채워진 수열)
따라서 A에서 적당한 값을 하나 삭제하고 임의의 홀수를 넣어준다.
원래문제에서 약수가 하나 있어야하므로 새로 넣어주는 홀수는 새로운 sum(A)의 약수가 돼야한다.
편의상, 2 + 2(N-1) (가장 큰 짝수)를 삭제한다. (난 그랬다. 다른수를 삭제해도 될 것이다.)
그 다음 2이상 2+2(N-2)이하 짝수들의 합을 구한다. 이를 s하자.
새로운 홀수를 k라하자. (s + k) % k = 0가 되면된다.
문제에서 조건을 만족하는 수열은 항상 존재한다고 했다.
k를 3이상 10^6미만 홀수들을 다 넣어주면서 (s+k)%k가 0가 되면 답을 도출해낸다.
for i in range(1, N + 1):
ans.append(2 * i)
ans.pop()
ref = sum(ans)
for i in range(3, 10 ** 6, 2):
val = ref + i
if val % i == 0:
ans.append(i)
break
근데 여기서 찝찝함을 느꼈다. 증명을 해보자.
증명
풀이에서 가장 큰 짝수를 삭제했으므로 홀수를 추가하기전의 sum(A) = N(N-1)일 것이다. 등차수열 합 공식에 대입해본 결괴이다.(초항이 2이고 공차가 2) 이는 N에 상관없이 홀수 * 짝수 형식이다.
N(N-1) + k = x * k (k는 홀수,x는 정수)가 돼야한다. N(N-1) = (x-1)k가 돼야한다.
좌변은 홀수*짝수이다. 우변은 홀수*(x-1)이다. x-1은 짝수가 돼야한다. 적당한 k와 적당한x가 존재한다.
특수한 경우
많은 문제에서 N이 작다면 규칙에 안맞는 경우가 있다.
(여기선 N=1과 N=2라면 규칙에 안맞음을 알 수 있다.)
이건 그냥 구해주면된다. 브루트포싱을 쓰든 뭘하든...
케이스처리를 해줘야한다.
'알고리즘문제풀이' 카테고리의 다른 글
백준1399 보물의 위치 (0) | 2023.08.09 |
---|---|
백준 28427 Tricknology (1) | 2023.08.03 |
재밌는 문제 백준 21315 카드섞기 (0) | 2023.07.31 |
백준 23758 중앙값 제거 (0) | 2023.07.29 |
백준 28339 이상한 드래프트 (0) | 2023.07.28 |