담배팔이소년
[SWEA] 3238 이항계수 구하기 본문
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