ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 15718 |
문제명 | 돌아온 떡파이어 |
레벨 | 플래티넘 3 |
분류 |
수학, 정수론 |
시간복잡도 | O(qlogn) |
인풋사이즈 | q<=1000, n<=10^9 |
사용한 언어 | Python |
제출기록 | 33916KB / 240ms |
최고기록 | 148ms |
해결날짜 | 2021/01/31 |
"""Solution code for "BOJ 15718. 돌아온 떡파이어".
- Problem link: https://www.acmicpc.net/problem/15718
- Solution link: http://www.teferi.net/ps/problems/boj/15718
"""
from teflib import combinatorics
from teflib import numtheory
MOD_FACTORS = (97, 1031) # 100007 = 97 * 1031
def main():
comb_tables = {p: combinatorics.CombTable(p - 1, p) for p in MOD_FACTORS}
T = int(input())
for _ in range(T):
N, M = [int(x) for x in input().split()]
if M == 1:
print(1 if N == 0 else 0)
continue
elif M > N + 1:
print(0)
continue
rems = []
for p in MOD_FACTORS:
comb_table = comb_tables[p]
n, k = N - 1, min(M - 2, (N - 1) - (M - 2))
rem = 1
while n > 0:
n, n_mod = divmod(n, p)
k, k_mod = divmod(k, p)
rem *= comb_table.get(n_mod, k_mod)
rems.append(rem % p)
print(
numtheory.linear_congruences(rems, MOD_FACTORS,
coprime_moduli=True)[0])
if __name__ == '__main__':
main()