aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

2007 JOI 春 Fermat (python)

素数についての謎の知識を二つ得た
1. p が素数のとき、x^n % p = x^(n%(p-1)) % p
2. p-1 > c > 1 のとき、x^n+y^n≡c (mod p) を満たす個数は0または x^n+y^n≡1 (mod p) を満たす個数に等しい。
証明はここをみてください。
フェルマー方程式/Fermat(JOI2007春合宿Day2 2nd) - Tsuzu's Notes

競プロにどの程度必要なのかは知らないが、2. を考えないと python では TLE し続けた。

p = int(input())
n = int(input())
n %= p-1
chk = [0]*p
for i in range(p):
  c = pow(i, n, p)
  chk[c] += 1
  
a0 = chk[0]**3
a1 = chk[0]*chk[1]*2*chk[1]
cnt = 0
for i in range(1,p):
  h = chk[i]
  if h == 0:
    continue
  a0 += h*chk[p-i]*chk[0]
  cnt += h//h
  
for i in range(2,p):
  a1 += chk[i]*chk[p-i+1]*chk[1]
  
print(a0+a1*cnt)