[파이썬] 11401번. 이항 계수 3 풀이

2023. 9. 7. 17:52·알고리즘과 코딩 테스트/백준 25단계

간단하게 nCk -> n!/k!(n-k)! 같은 방식으로 문제를 풀 수 없다.

문제의 N과 K가 매우 크기 때문에 기존의 팩토리얼 알고리즘은 시간/공간 복잡도를 초과한다.

 

하지만 문제에서는 nCk 값을 1,000,000,007로 나누라고 했으므로 나머지를 구하는 소수(P)가 주어졌다.

 

그러면 페르마의 소정리를 적용할 수 있다. 자세한 것은 생략하지만, 조합 공식을 곱셈 형태로 변형할 수 있다.

∴ nCk​ % P = n! x ((n−k)!k!)^P−2 % P 

 

여기서도 n, k, n-k의 팩토리얼을 그대로 구할 수 없기 때문에, 나머지 연산을 적용한 팩토리얼을 구하기 위해서

나머지 연산의 분배법칙 중 곱셈에 대한 분배법칙을 사용하면 된다!

(A x B) % P = ((A % P) x (B % P)) % P

 

즉, A에 해당하는 n!를 P로 나머지 연산하면서 구하고,

B에 해당하는 (k!(n-k)!)^P-2 도 P를 나머지로 한 분할 정복을 이용한 거듭제곱을 이용하면 된다!

 

"분할 정복을 이용한 거듭제곱"은 여기서 참고할 수 있다.

2023.09.07 - [파이썬 알고리즘/백준 25단계] - [파이썬] 1629번. 곱셈 풀이

 

[파이썬] 1629번. 곱셈 풀이

이 문제의 분류는 "분할 정복을 이용한 거듭제곱" 이다. 즉, 어떤 수를 매우 큰 횟수로 거듭제곱 한다면, 시간복잡도를 줄이는 방법을 묻는 문제인 것이다. 예를 들어, 2를 32번 제곱한다는 것은 ->

sweetburble.tistory.com

 


# 팩토리얼 값 계산 (나머지 연산 적용)
def factorial_with_rest(N, rest):
    n = 1
    for i in range(2, N+1):
        n = (n * i) % rest
    return n

# 거듭제곱 계산 (나머지 연산 적용)
def reduce_pow(a, b, c):
    if (b == 1):
        return a % c

    X = reduce_pow(a, b//2, c)

    if (b % 2 == 0): # 짝수라면
        return X * X % c
    else: # 홀수라면
        return a * X * X % c


N, K = map(int, input().split())
P = 1000000007

first = factorial_with_rest(N, P)
second = factorial_with_rest(K, P) * factorial_with_rest(N-K, P)

print(first * reduce_pow(second, P-2, P) % P)

'알고리즘과 코딩 테스트 > 백준 25단계' 카테고리의 다른 글

[파이썬] 1629번. 곱셈 풀이  (0) 2023.09.07
[파이썬] 9663번. N-Queen 풀이  (0) 2023.03.04
[파이썬] 15650번. N과 M (2) 풀이  (0) 2023.03.03
[파이썬] 2004번. 조합 0의 개수 풀이  (0) 2023.02.24
[파이썬] 9375번. 패션왕 신해빈 풀이  (0) 2023.02.22
'알고리즘과 코딩 테스트/백준 25단계' 카테고리의 다른 글
  • [파이썬] 1629번. 곱셈 풀이
  • [파이썬] 9663번. N-Queen 풀이
  • [파이썬] 15650번. N과 M (2) 풀이
  • [파이썬] 2004번. 조합 0의 개수 풀이
달거달거
달거달거
개발자를 꿈꿉니다
  • 달거달거
    SWEE IT
    달거달거
  • 전체
    오늘
    어제
    • 분류 전체보기 (288)
      • 개발 환경 (5)
        • VSCode (1)
        • 파이썬 (Anaconda) (1)
        • Git (1)
        • Flutter (0)
        • Kotlin (1)
      • Spring (5)
        • 스프링 부트와 JPA 실무 완전 정복 로드맵 (2)
        • 스프링 부트와 AWS로 구현하는 웹 서비스 (1)
        • 채쌤의 스프링 부트 프로젝트 (1)
      • 알고리즘과 코딩 테스트 (16)
        • 파이썬 문법 (2)
        • 백준 25단계 (10)
        • 프로그래머스 코딩 테스트 고득점 Kit (1)
        • 코틀린 문법 (1)
      • 요리 (236)
      • 데이터베이스 (2)
        • MySQL (2)
      • 안드로이드 (11)
        • 연습 코드 (6)
        • 도서 내용 정리 (4)
      • Dart와 Flutter (5)
        • 도서 내용 정리 (4)
        • Flutter 위젯 정리 (1)
        • 15개 프로젝트 (2)
      • 피그마 (0)
        • 도서 내용 정리 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C
    코틀린
    프로그래머스
    node.js
    mysql
    데이터베이스
    AWS
    백준
    아나콘다
    docker
    머신러닝
    파이썬
    vscode
    코딩 테스트
    JPA
    Flutter
    알고리즘
    피그마
    자취요리
    주석
    문법
    안드로이드
    spring
    c++
    오블완
    티스토리챌린지
    DART
    git
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
달거달거
[파이썬] 11401번. 이항 계수 3 풀이
상단으로

티스토리툴바