SWEA_D3_5607
๐ [D3_5607] [Professional] ์กฐํฉ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution{
static long res;
static final long num = 1234567891;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = null;
// ํ
์คํธ ์ผ์ด์ค
int TC = Integer.parseInt(br.readLine());
for(int tc=1; tc<=TC; tc++) {
sb.append("#").append(tc).append(" ");
st = new StringTokenizer(br.readLine(), " ");
// nCr N
int N = Integer.parseInt(st.nextToken());
// R
int R = Integer.parseInt(st.nextToken());
res = 0;
// N factorial ๊ตฌํ๊ธฐ
long[] fac = new long[N+1];
fac[0] = 1;
for(int i=1; i<=N; i++) {
fac[i] = (fac[i-1]*i) % num;
}
// nCr = n! / (n-r)! * r!
// ๋ถ์
long up = fac[N];
// ๋ถ๋ชจ
long down = (fac[N-R] * fac[R]) % num;
// ํ๋ฅด๋ง ์์ ๋ฆฌ
// nCr = n! * ((n-r)! * r!)^(num-2)
long reFacDown = pow(down, num-2);
// nCr ๊ณ์ฐ
res = (up*reFacDown)%num;
sb.append(res).append("\n");
}
System.out.println(sb);
}
// aโฟ ๊ตฌํ๊ธฐ ์ต์ ์ ๋ฐฉ๋ฒ
static long pow(long a, long N) {
// ์กฐํฉ ์ฑ์ง
if(N==0) return 1;
if(N==1) return a;
// ์ง์์ด๋ฉด
if(N%2==0) {
long temp = pow(a,N/2);
return (temp*temp)%num;
}
long temp = pow(a,N-1)%num;
return (temp*a)%num;
}
}
๐ค ๋์ ์๊ฐ
์ด ๋ฌธ์ ๋ ์กฐํฉ๋ฌธ์ ์ด์ง๋ง ์ผ๋ฐ ์กฐํฉ๋ฌธ์ ๊ฐ ์๋๋ค.
ํ๋ฅด๋ง ์์ ๋ฆฌ๋ฅผ ์ด์ฉํด์ผํ๋ค.
์์์ p๊ฐ num ๊ฐ์ด ๋๋ ๊ฒ์ด๋ค. ๊ฒฐ๊ณผ๋ ์์ ์ด์ฉํด์ ๊ฐ์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ Math.pow() ๊ณผ์ ์ ํ๊ณ mod ๋ฅผ ํด์ฃผ๊ธฐ์๋ Math.pow()ํ๋ ๊ณผ์ ์์ ์์ ํฌ๊ธฐ๊ฐ ์์ฒญ๋๊ฒ ์ปค์ง๊ธฐ ๋๋ฌธ์ pow๋ฅผ ์ง์ ์ฌ๊ท ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ฌ ๊ณฑํ ๋๋ง๋ค mod๋ฅผ ์งํํด ๊ฐ์ด ์ปค์ง๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.