Algorithm & Data Structures/SWEA

5607. 조합 (Java)

Geisha 2023. 10. 11. 15:17

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Solution{

	static int T;
	static long dp[];
	static int n, r;
	static final int P = 1234567891;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;
		T = Integer.parseInt(br.readLine());
		dp = new long[1000001]; // dp[i] = i! % P
		dp[1] = 1;

		for (int i = 2; i <= 1000000; i++) {
			dp[i] = (dp[i - 1] * i) % P;
		}

		for (int t = 1; t <= T; t++) {
			st = new StringTokenizer(br.readLine());
			n = Integer.parseInt(st.nextToken());
			r = Integer.parseInt(st.nextToken());
			

			// 분모
			long bottom = (dp[n-r] * dp[r]) % P;
			
			long B = pow(bottom, P-2);
			long ans = (dp[n] * B) % P;
			
			sb.append("#").append(t).append(" ").append(ans).append("\n");
		}
		
		bw.write(sb.toString());
		bw.flush();
		bw.close();
		
	}

	static long pow(long a, int b) {
		if (b == 0)
			return 1;
		else if (b == 1)
			return a;
		if (b % 2 == 0) { //
			long tmp = pow(a, b / 2);
			return (tmp * tmp) % P;
		}
		long tmp = pow(a, b - 1);
		return (tmp * a) % P;
	}
}