문제 링크
n과 m이 주어졌을 때 아래 식에서 ans를 구하면 되는 문제입니다.
n(n−1)(n−2)⋯21≡ansmodm
풀이를 설명하기 전에 아래와 같이 Ei와 ϕi(n)을 정의하겠습니다.
Ei=i(i−1)(i−2)⋯21ϕi(n)={(ϕ∘ϕi−1)(n),ifx<0n,otherwise
처음 이 문제를 볼 때 오일러의 정리를 연쇄적으로 사용해서 해결할 수 있을것 같다는 생각이 들었습니다.
실제로 다음과 같이 식을 전개할 수 있습니다.
g0En−1⋅(g0n)kn−1≡ansmodmg1En−2⋅(g1n−1)kn−2≡kn−1modϕ(m)g2En−3⋅(g2n−2)kn−3≡kn−2modϕ2(m)⋯
여기서 Ei≡kimodϕn−i(m)이고 gi는 gcd(gin−i,ϕi(m))=1을 성립시키는 가장 작은 양의 정수입니다. 그러면 오일러의 정리를 계속 사용할 수 있어 위와 같이 식 전개를 할 수 있습니다.
그럼 식을 어디까지 전개해야할까요? 먼저 다음 정리를 증명해 보겠습니다.
Theorem 1. m≥2이면 ϕ2(m)≤2m
m=2rpi∏piri라고 합시다.
Case 1) r>0
ϕ(m)=2r−1pi∏piri−1(pi−1)≤21ϕ(m)가 성립합니다. ϕ2(m)≤ϕ(m)은 자명하므로 ϕ2(m)≤2m가 성립합니다.
Case 2) r=0
ϕ(m)≤m−1은 자명합니다. 그리고 ϕ(m)=pi∏piri−1(pi−1)이 성립하는데 각 pi−1은 짝수이므로 ϕ(m) 또한 짝수입니다. 즉, Case 1)에 의하여 ϕ2(m)≤21ϕ(m)≤2m이 성립합니다.
즉, Theorem 1에 의하여 O(logm)번만 전개하면 충분합니다. 그런데 문제는 giEn−i−1를 어떻게 계산해야 할까요? 당연하지만 gcd(gi,ϕi(m))=1이므로 오일러의 정리를 그대로 사용할 수 없습니다.
하지만 다음 정리를 증명하면 오일러의 정리 비슷하게 계산할 수 있게됩니다.
Theorem 2. aϕ(m)≡a2ϕ(m)modm
m=i=1∏vpiri,a=j=1∏wqisi이라고 하겠습니다. 그리고 {p1,p2,⋯,pu}={q1,q2,⋯,qu},{pu+1,⋯,pv}∩{qu+1,⋯,qw}=∅라고 하겠습니다.
Case 1) u+1≤i≤v
gcd(piri,a)=1이므로 aϕ(m)≡1modpiri이 성립합니다.
Case 2) 1≤i≤u
pipiri−1(pi−1)≡0modpiri가 성립합니다. 즉, aϕ(m)≡0modpiri이 성립합니다.
Case 1, 2에 의하여 aϕ(m)≡a2ϕ(m)modpiri이 항상 성립합니다. 즉, 중국인의 나머지 정리에 의하여 aϕ(m)≡a2ϕ(m)modm이 성립합니다.
E5>109 입니다. 즉, giEn−i−1를 계산할 때 n−i−1≤4라면 Naive하게 계산하고 n−i−1≥5이면 giEn−i−1≡gikn−i−1+ϕi+1(m)modϕi(m) 이므로 gikn−i−1+ϕi+1(m)를 계산하면 됩니다.
시간복잡도는 O(logm⋅(logm+π(m)))입니다.