题目
思路
求
2
2
2
…
m
o
d
p
2^{2^{2^{…}}}\mod p
222…modp。
显然有伟大先哲告诉我们:
a
b
m
o
d
p
=
a
b
m
o
d
ϕ
(
p
)
+
ϕ
(
p
)
(
b
>
=
ϕ
(
p
)
)
a^b\mod p=a^{b\mod \phi(p)+\phi(p)}(b>=\phi(p))
abmodp=abmodϕ(p)+ϕ(p)(b>=ϕ(p))
然后就代入直接算就好了,建议用非筛法求
ϕ
\phi
ϕ
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
long long t,n;
long long ksm(long long x,long long y,long long myd)
{
long long ans=1;
while (y)
{
if (y&1) ans=ans*x%myd;
x=x*x%myd;
y>>=1;
}
return ans;
}
long long phi(long long x)
{
long long o=2,ans=x;
while (o*o<=n)
{
if (x%o==0)
{
ans=ans/o*(o-1);
while (x%o==0) x/=o;
}
o++;
}
if (x>1) ans=ans/x*(x-1);
return ans;
}
long long f(long long x)
{
if (x<3) return 0;
long long y=phi(x);
return ksm(2,y+f(y),x);
}
int main()
{
cin>>t;
while (t--)
{
cin>>n;
cout<<f(n)<<endl;
}
return 0;
}