https://yukicoder.me/problems/no/1140
前提知識
解説
https://yukicoder.me/submissions/522953
難しい問題に見える。要求事項として、以下がある。
Pが素数かを判定
素数判定には色々やり方があるが、Pの上限は5×106なので、
エラトステネスの篩で前計算しておいて、素数判定はO(1)とするのがいい。
まあ、この辺は頑張ってほしい。
AのP!乗?
普通に計算するのは無理というのは何となく分かる。
累乗のmod Pは見覚えが無いだろうか?
そう。フェルマーの小定理である。
A^{P!}
= A^{P(P-1)(P-2)!}
= (A^{P-1})^{P(P-2)!}
= 1^{P(P-2)!}
= 1
このように言い換えることができるので、基本的には答えは1になる。
コーナーケースとしてA mod Pが0の場合がある。
ll A; int P; vector<bool> primes; //--------------------------------------------------------------------------------------------------- void solve() { cin >> A >> P; if (!primes[P]) { printf("-1\n"); return; } if (A % P == 0) printf("0\n"); else printf("1\n"); } //--------------------------------------------------------------------------------------------------- void _main() { int T; cin >> T; primes = makePrimesBool(5010101); rep(t, 0, T) solve(); }