It's easy, if you try

[백준/boj] 11401: 이항 계수 3 / 페르마의 소정리 / 수학 / 정수론 본문

알고리즘/자바(Java)

[백준/boj] 11401: 이항 계수 3 / 페르마의 소정리 / 수학 / 정수론

s5he2 2021. 4. 19. 22:01
반응형

문제

 

11401번: 이항 계수 3

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

www.acmicpc.net

풀이

1,000,000,007 는 int 범위 중 가장 큰 소수 값이다.

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

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static int MOD = 1000000007;
	public static void main(String[] args) throws Exception {
			st= new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			int R = Integer.parseInt(st.nextToken());
			System.out.println(nCr(N, R, MOD));
	}
	
	private static long nCr(int n, int r, int p) {
		if(r == 0) return 1L;
		
		long[] fac = new long[n+1];
		fac[0] = 1;
		
		for(int i=1; i<=n; i++)
			fac[i] = fac[i-1] * i % p;
		
		return (fac[n] * power(fac[r], p-2, p)
				% p * power(fac[n-r], p-2, p) % p) %p;
		
	}

	private static long power(long x, long y, long p) { // 제곱수 구하기, 분할 정복  
		long res = 1L;
		x = x % p;
		//=> 3^7 > 7 3 1
		while(y > 0) {
			if(y % 2 == 1)
				res = (res * x) % p;
			y = y >> 1;
			x = (x * x) % p;
		}
		return res;
	}
}

$a^p = a \pmod p$ ⇒ 참

$a^{p-1} = 1 \pmod p$ ⇒ 참

$a^{p-2} = \frac{1}{a} \pmod p$ ⇒ 추정

$\frac{7!}{2!5!} \pmod {11} = {7!} * ({2!}*{5!})^{11-2}$

반응형
Comments