上帝与集合的正确用法 HYSBZ - 3884(欧拉降幂)
题目大意
给出一个n求
无
限
个
2
{
2
2
2
2
.
.
.
%
n
无限个2\begin{cases}2^{2^{2^{2^{...}}}}\end{cases}\%n
无限个2{2222...%n
解题思路
对式子应用欧拉降幂
f
(
n
)
=
2
2
2
.
.
.
%
n
=
2
2
2
.
.
.
%
ϕ
(
n
)
+
ϕ
(
n
)
%
n
f(n)=2^{2^{2^{...}}}\%n\\ =2^{2^{2^{...}}\%\phi(n)+\phi(n)}\%n
f(n)=222...%n=222...%ϕ(n)+ϕ(n)%n
其中
2
2
2
2
.
.
.
%
ϕ
(
n
)
=
f
(
ϕ
(
n
)
)
2^{2^{2^{2^{...}}}}\%\phi(n)=f(\phi(n))
2222...%ϕ(n)=f(ϕ(n))
而
ϕ
(
x
)
\phi(x)
ϕ(x)为将递归递减而
f
(
1
)
=
0
f(1)=0
f(1)=0故可以通过递归得解
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int quick_pow(int a,int b,int p)
{
int ans=1;a=1LL*a%p;
while(b)
{
if(b&1) ans=1LL*ans*a%p;
a=1LL*a*a%p;
b>>=1;
}
return ans;
}
int eular(int n)
{
int ans=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
ans=ans-ans/i;
do n/=i;
while(n%i==0);
}
}
if(n>1) ans-=ans/n;
return ans;
}
int f(int n)
{
if(n==1) return 0;
int phi=eular(n);
return quick_pow(2,f(phi)+phi,n);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cout<<f(n)<<endl;
}
}