以下、f(x,y,z)=xy mod zf(x,y,z)=x^y\ {\rm mod} \ zとして、一般論について述べた上で、今回のケースへの適用方法を示す。

xxzzに共通する素因数をp1,p2,pkp_1,p_2,\cdots p_kとし、z=p1e1p2e2pkekuz=p_1^{e_1}p_2^{e_2}\cdots p_k^{e_k}u(ただし、uup1,p2,pkp_1,p_2,\cdots p_kのいずれとも互いに素な整数)とする。この時、p1e1,p2e2,pkek,up_1^{e_1},p_2^{e_2},\cdots p_k^{e_k},uは全て互いに素な整数となるので、f(x,y,z)f(x,y,z)の値を求める場合、f(x,y,p1e1),f(x,y,p2e2),f(x,y,pkek),f(x,y,u)f(x,y,p_1^{e_1}),f(x,y,p_2^{e_2}),\cdots f(x,y,p_k^{e_k}),f(x,y,u)の値を求めれば良い。

f(x,y,piei)  (i=1,2,k)f(x,y,p_i^{e_i})\ \ (i=1,2,\cdots k)の求め方

xxpip_iで割れる回数をviv_iとすると、viyeiv_iy\geq e_iならばf(x,y,piei)=0f(x,y,p_i^{e_i})=0であり、viy<eiv_iy<e_iならばf(x,y,piei)=piviyf(x,y,p_i^{e_i})=p_i^{v_iy}である。

今回の場合、f(a,a(n1),piei)f(a,a\uparrow\uparrow (n-1),p_i^{e_i})を求めれば良い。a(n1)a\uparrow\uparrow (n-1)の値は多くの場合とてつもなく大きな値になるが、今回の場合はvia(n1)v_i\cdot a\uparrow\uparrow (n-1)eie_iの大小関係さえ分かれば良い。

xix_ipip_iを素因数に持つので、vi1v_i\geq 1である。また、zpieiz\geq p_i^{e_i}より1092ei10^9\geq 2^{e_i}なので、eilog2109=29.8e_i\leq \log_2{10^9}=29.8\cdotsよりei29e_i\leq 29である。よって、via(n1)<eiv_i\cdot a\uparrow\uparrow (n-1)<e_iならばa(n1)<29a\uparrow\uparrow (n-1)<29なので、a(n1)28a\uparrow\uparrow (n-1)\leq 28となるケースについてのみ考えれば良い。

a(n1)28a\uparrow\uparrow (n-1)\leq 28となる(a,n)(a,n)の組は以下の通り。

aanna(n1)a\uparrow\uparrow (n-1)
任意1100
2828以下の整数22aa
223344
33332727
22441616
1122以上の整数11

よって、これらの組に該当するならばvia(n1)v_i\cdot a\uparrow\uparrow (n-1)の値を直接計算すれば良い。また、該当しないならばvia(n1)eiv_i\cdot a\uparrow\uparrow (n-1)\geq e_iとなる。

f(x,y,u)f(x,y,u)の求め方

xxuuは互いに素であるから、オイラーの定理よりxφ(u)1 (mod u)x^{\varphi (u)}\equiv 1\ ({\rm mod}\ u)である。(φ(u)\varphi (u)オイラーのφ関数) よって、y mod φ(u)=wy\ {\rm mod}\ \varphi(u)=wとすると、f(x,y,u)=xw mod uf(x,y,u)=x^w\ {\rm mod}\ uである。

今回の場合はw=a(n1) mod φ(u)w=a\uparrow\uparrow (n-1)\ {\rm mod}\ \varphi(u)を求めれば良いので、再帰関数を利用すると良い。以下では、再帰の回数がO(logm)O(\log m)で済むことを示す。

まず、umu\leq mより、φ(u)u\varphi(u)\leq uであり、

  • uuが奇数の時、uuの素因数分解をi=1kpiei\prod_{i=1}^k p_i^{e_i}とする。(ただし、p1,p2,pkp_1,p_2,\cdots p_kは全て奇数)この時、φ(u)=i=1kpiei1(pi1)\varphi(u)=\prod_{i=1}^k p_i^{e_i-1}(p_i-1)となるため、φ(u)\varphi(u)は偶数となる。また、φ(u)<u\varphi(u)<uである。
  • uuが偶数の時、uu以下の偶数は全てuuと互いに素でないので、φ(u)u2\varphi(u)\leq \frac{u}{2}である。

以上より、どんなuuについてもφ\varphiを2回適用すると、その値は半分以下になる。よって、再帰の回数はO(logm)O(\log m)で済む。(出典:アメリカ音ゲーマーぁぁさんのツイート

また、この問題ではf(x,y,z)f(x,y,z)を求める際、zzの素因数分解がボトルネックとなるので、計算量は2(m+m2+m4+)=O(m)2\left(\sqrt{m}+\sqrt{\frac{m}{2}}+\sqrt{\frac{m}{4}}+\cdots\right)=O(\sqrt{m})以下となる。よって、制限時間内に間に合う。

解答例は以下の通り。

ans.cpp

質問・誤りがある場合

Twitterに連絡ください。ID : @YS55749378