담배팔이소년

[SWEA] 3238 이항계수 구하기 본문

Algorithm

[SWEA] 3238 이항계수 구하기

bkkmw 2023. 7. 31. 23:26

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWAe8zYKfUsDFAUw 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제 풀이

 

package swea;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution_3238{
	public static void main(String[] args) throws Exception{
		System.setIn(new FileInputStream("input/swea/input_3238.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;

		int TC = Integer.parseInt(br.readLine());
		for(int tc=1; tc<TC+1; tc++) {
			st = new StringTokenizer(br.readLine(), " ");
			long N = Long.parseLong(st.nextToken());
			long R = Long.parseLong(st.nextToken());
			int P = Integer.parseInt(st.nextToken());

			int ans = solve(N, R, P);
			sb.append(String.format("#%d %d\n", tc, ans));
		}
		System.out.println(sb.toString());
	}

	static int solve(long N, long R, int P) {
		long ret = 1;
		long[] ftable = generate_table(P);

		while(N > 0) {
			int nmod = (int)(N % P);
			int rmod = (int)(R % P);
			if(nmod < rmod) return 0;
			ret *= ftable[nmod] % P;
			ret %= P;
			ret *= (calc_mod((ftable[rmod]*ftable[nmod-rmod])%P, P-2, P)) % P;
			ret %= P;
			N /= P; R /= P;
		}
		return (int)ret;
	}

	static long calc_mod(long val, int p, int P) {
		if(p==0) return 1;
		long ret = calc_mod(val, p/2, P);
		if(p%2==0) return (ret*ret) % P;
		else return (ret * ((ret*val)%P)) % P;
	}

	static long[] generate_table(int P) {
		long[] ret = new long[P+1];
		ret[0] = 1;
		for(int i=1; i<P+1; i++) 
			ret[i] = (ret[i-1] * i) % P;
		return ret;
	}
}

'Algorithm' 카테고리의 다른 글

[BOJ] 01520 내리막 길  (0) 2023.09.06
[BOJ] 02116 주사위 쌓기  (0) 2023.09.06
[BOJ] 06198 옥상 정원 꾸미기  (0) 2023.07.19
[BOJ] 13459 구슬 탈출  (1) 2023.07.12
[BOJ] 17836 공주님을 구해라!  (0) 2023.07.03
Comments