본문 바로가기

알고리즘/백준

[백준] 11401 이항계수3

문제링크: www.acmicpc.net/problem/11401

 

11401번: 이항 계수 3

자연수 \(N\)과 정수 \(K\)가 주어졌을 때 이항 계수 \(\binom{N}{K}\)를 1,000,000,007로 나눈 나머지를 구하는 프로그램을 작성하시오.

www.acmicpc.net

예전에 들어본 적 있어서 페르마의 소정리로 풀어야 한다는 것은 기억했지만

정리가 기억나지 않았다.

적어두고 반복해봐야겠다.

import java.io.*;
import java.util.*;

public class Main {
	public static final long MOD = 1000000007;
	public static long fac[];
	
	public static long power(long num,long cnt) {
		if(cnt==0 || num==0) return 1;
		long temp = power(num,cnt/2);
		temp = temp*temp % MOD;
		if(cnt%2==1) {
			temp*=num % MOD;
		}
		return temp % MOD;
	}
	
	public static void init(int N) {
		fac[0] = 1;
		fac[1] = 1;
		fac[2] = 2;
		for(int i=3;i<=N;i++) {
			long x = i;
			fac[i] = (fac[i-1] * x)%MOD;
		}
	}

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N,K;
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		fac = new long[N+3];
		init(N);
		
		long B = (fac[K]*fac[N-K])%MOD;
		System.out.println((fac[N]*power(B,MOD-2)%MOD));
		
	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 10830 행렬 제곱  (0) 2020.12.20
[백준] 2740 행렬 곱셈  (0) 2020.12.20
[백준] 1629 곱셈  (2) 2020.12.20
[백준] 1992 쿼드트리  (0) 2020.12.20
[백준] 1541 잃어버린 괄호  (0) 2020.12.20