목차

돌아온 떡파이어

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()