최대 1 분 소요

1. 문제

https://www.acmicpc.net/problem/11401

  • 분할정복 문제
// 문제
자연수 N과 정수 K가 주어졌을  이항 계수 
(N/K) 1,000,000,007 나눈 나머지를 구하는 프로그램을 작성하시오.

// 입력
첫째 줄에 N과 K가 주어진다. (1  N  4,000,000, 0  K  N)

// 출력
(N/K) 1,000,000,007 나눈 나머지를 출력한다.

// 예제 입력 1 
5 2

// 예제 출력 1 
10


2. 핵심 아이디어

  • 페르마의 소정리를 이용하여 조합 공식 곱셈 형태로 변형


3. Python 문제풀이

import sys
input = sys.stdin.readline

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

def factorial(N) :
  n = 1
  for i in range(2, N+1) :
    n = (n * i) % num
  return n

def square(n, k) :
  if k == 0 :
    return 1
  elif k == 1 :
    return n
  tmp = square(n, k//2)
  if k % 2 :
    return tmp * tmp * n % num
  else :
    return tmp * tmp % num

top = factorial(N)
bottom = factorial(N-K) * factorial(K) % num

print(top * square(bottom, num-2) % num)


4. Java 문제풀이


댓글남기기