from ABC186 ABC186E

  • image
  • E - Throne
  • 要するに となるnを求めよという問題
    • n = -S / Kすればいい
    • mod Nなので割り算には逆元の計算が必要
  • Kのmod Pでの逆元を求めれば良い
    • が、普段使ってたフェルマーの小定理を使うコードはPが素数でない時に正しくない値を返す
    • サンプルに入ってた3のmod 10での逆元がまさにこれ。1になってしまう。
    • 本当は7:
  • 拡張ユークリッド互除法を使って逆元を求める
  • この場合もKとPが互いに素であることが必要なので、先にgcdして1でないなら割っておく
    • Sを割り切れない時は解なし python
def solve(N, S, K):
    from math import gcd
    g = gcd(K, N)
    if g > 1:
        if S % g != 0:
            return -1
        N //= g
        K //= g
        S //= g

    invK = mod_inverse_ee(K, N)
    ret = (N - S) * invK % N

    return ret