M=998244353이라고 하자. M은 소수이므로, M으로 나누어떨어지지 않는 모든 정수는 법 M에서 역원을 가진다.
또한 페르마의 소정리에 의해, a≡0(modM)이면
aM−1≡1(modM)
이다.
따라서 법 M에서 0이 아닌 수의 거듭제곱을 계산할 때, 지수는
φ=M−1=998244352
로 나눈 나머지만 중요하다.
문제의 조건에서
gcd(∣q∣,φ)=1
이므로, q는 법 φ에서 역원을 가진다. 즉 어떤 정수 r이 존재하여
qr≡1(modφ)
를 만족한다.
원래 식은
xq≡np(modM)
이다. 양변을 r제곱한다고 생각하면
(xq)r≡(np)r(modM)
이고,
xqr≡npr(modM)
이다. 그런데 qr≡1(modφ)이므로, 페르마의 소정리에 의해
xqr≡x(modM)
이다. 따라서
x≡npr(modM)
이다.
즉 가능한 x는 하나뿐이고, 정답은
npq−1(modM)
이다. 여기서 q−1은 법 M에서의 역원이 아니라, 법 M−1에서의 역원이다.
알고리즘은 다음과 같다.
- φ=998244352로 둔다.
- p를 법 φ에서 정규화하여 P를 구한다.
- q를 법 φ에서 정규화한 뒤, 확장 유클리드 알고리즘으로 역원 r을 구한다.
- e≡Pr(modφ)를 계산한다.
- 빠른 거듭제곱으로 ne(modM)을 계산하여 출력한다.
주의할 점은 998244352가 소수가 아니라는 것이다. 따라서 q−1(mod998244352)는 페르마의 소정리로 구하면 안 되고, 확장 유클리드 알고리즘으로 구해야 한다.
또한 p,q가 음수일 수 있으므로, 나머지를 계산할 때 항상 0 이상 φ−1 이하가 되도록 정규화해야 한다.
시간 복잡도는 O(logM)이다.