phyllo’s algorithm note

レッドコーダーへの道のりは遠い。休んでる場合じゃない!

yukicoder No.1140 EXPotentiaLLL!

問題

T個のテストケースについて、
Pが素数か判定し、素数でなければ-1、素数ならば、A^(P!) mod Pを求めよ。

制約

  • 1 <= T <= 5 * 10^5
  • 1 <= A <= 10^18
  • 1 <= P <= 5 * 10^6

解法

Pが素数かどうかは、素数テーブルを最初に作っておけばO(1)で求められるのでよい。

A^(P!) mod Pは、P! mod PがPが入っているので、常に0になることがわかる。
なので、A^0=1かというと、計算的にAによって他の値も取りうる。
AがPの倍数の場合は、0を何回も掛け合わせることになるので、答えも0になる。
したがって、倍数チェックをして倍数なら0、そうでなければ1となる。