http://acmicpc.net/problem/21760
{코드}
for _ in range(int(input())):
n, m, k, d = map(int, input().split())
b = 2*d//(k*n*m*(m-1) + m*m*n*(n-1))
if b:
print(m*(m-1)*n*k*b//2 + m*m*n*(n-1)*b//2)
else:
print(-1)
{설명}
A와 B의 관계를 알고, k가 주어지기 때문에 다음과 같은 식이 성립합니다.
A*N*(M*(M-1))/2 + B*(N*(N-1))/2)*M*M <= D
여기서 A가 k*B이므로 위 식은 밑의 식과 같습니다.
N*M((M-1)*K + (N-1)*M)/2 * B <= D
왜 이런 식이 성립하냐면 먼저 지역 리그의 수는 N개 이며 하나의 지역 내에서 M개의 팀 중에서 2개를 고르기에 M*(M-1)이 되어 한 지역 리그 내의 수는 N*M*(M-1)가 됩니다.
다른 지역 리그와의 경기에서는 N개의 리그에서 두 개를 골라(N*(N-1)) 각 리그에서 한 팀을 고르므로 N*(N-1)*M*M이 됩니다.
여기에 각각 A와 B를 곱한 것이 D보다 작아야 하기에 위와 같은 식이 성립하는 것입니다.
그렇기에 B의 값을 한 번에 구할 수 있으며 만약 B가 0이하가 아니라면 구한 B를 통해 위 식을 계산할 값을 출력하면 되고 0 이하라면 -1을 출력하면 됩니다.
'알고리즘 공부 > BOJ백준 풀이' 카테고리의 다른 글
[백준 17612번-파이썬] 쇼핑몰 (0) | 2021.06.14 |
---|---|
[백준 21756번-파이썬] 지우개 (0) | 2021.06.14 |
[백준 18870번-파이썬] 좌표 압축 (0) | 2021.06.14 |
[백준 10773번-파이썬] 제로 (0) | 2021.06.14 |
[백준 4949번-파이썬] 균형잡힌 세상 (0) | 2021.06.14 |