2023. 9. 10. 20:41ㆍDiamond/Diamond V
SUAPC 2023 Summer B번 문제이며, 내가 출제한 세 번째 문제이다.
출제 여담은 SUAPC 2023 Summer 출제 후기에 충분히 썼으니 이번에는 이 문제의 수학적인 해결법에 대해 논하고자 한다. 에디토리얼에 있는 풀이 두 가지 대신 출제 때부터 마음 속에 품고 있었던 야매 풀이 하나와 어제 생각해 낸 제4의 풀이 이렇게 두 가지로.
그럼 본격적으로 풀이에 돌입해 보자.
문제
행렬식은 선형대수학에서 다루는 기초적인 대상 중 하나이다. 이항계수는 조합론에서 다루는 기초적인 대상 중 하나이다.
두 기초적인 대상을 섞은 문제는 기초적이므로, 다음 행렬의 행렬식을 구하는 문제는 기초적인 문제이다.
단,
기초적인 문제는 쉽게 풀 수 있으므로, 쿼리마다 정수
입력
첫 번째 줄에 쿼리의 수
두 번째 줄부터
각 쿼리는 두 줄로 이루어져 있다. 쿼리의 첫 번째 줄에는 행렬의 크기
예제 입력)
1
3
4 5 7
출력
한 줄에 하나씩 순서대로
예제 출력)
3
내 코드
mod = 10**9+7
fact = [1]*501
for i in range(2,501):
""" fact[N] = N! """
fact[i] = (fact[i-1]*i)%mod
hyper_fact = [1]
for i in range(1,501):
hyper_fact.append((hyper_fact[-1]*fact[i])%mod)
def inv(x): return pow(x,mod-2,mod)
def vandermonde(N,a):
ans = 1
for i in range(1,N):
for j in range(i):
ans = (ans*(a[i]-a[j]))%mod
return ans
for _ in range(int(input())):
N,a = int(input()),list(map(int,input().split()))
print((vandermonde(N,a)*inv(hyper_fact[N-1]))%mod)
일단 거두절미하고 문제의 정답은 다음과 같다.
우선 야매 풀이는 다음과 같다.
주어진 행렬
인수정리를 응용해 보자. 임의의
따라서
네 번째 풀이는 그냥 행렬을 통째로 행연산을 반복하여 취함으로서 얻을 수 있다. 모든 열이
반복적인 elementary row operation을 통해서 각 열에 최고차항만 남길 수 있고, 그렇게 해서 얻어진 행렬은 다음과 같이 Vandermonde matrix와 굉장히 유사한 형태를 띄게 된다.
공통된 상수를 행렬식 앞으로 꺼내주고, Vandermonde determinant를 계산해 주면 결과를 얻을 수 있다.
이로서 29150번의 풀이를 마친다.

'Diamond > Diamond V' 카테고리의 다른 글
BOJ 33414 - Bitvzhuh (0) | 2025.07.24 |
---|---|
BOJ 4149 - 큰 수 소인수분해 (Python3) (0) | 2022.12.01 |