数论好难啊.....真的学不来了qwq
看了一些博客 问了问老师才有点思路
这个东西好像可以递归搞
f(p)=c^c^c.....^c mod p;
由欧拉降幂公式:c^k mod p=c^( k mod phi(p) + phi(p) ) mod p;
其中 k=c^c^c^....^c;
所以有f(p)=c^( f(phi(p)) + phi(p) ) mod p;
这样就由f(p)-->f( phi(p) )
然后通过p-->phi(p)这样的变换大约log次就能变到1
所以这样单组复杂度就是log^2
/**************************************************************
Problem: 3884
User: syh0313
Language: C++
Result: Accepted
Time:1544 ms
Memory:89180 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using
namespace
std;
const
int
maxn=1e7+100;
int
T,primes[maxn],pi[maxn],cnt;
long
long
p;
bool
f[maxn];
long
long
po(
long
long
a,
long
long
b,
long
long
mo)
{
if
(b==0)
return
1%mo;
if
(b==1)
return
a%mo;
long
long
c=po(a,b/2,mo);
if
(b&1)
return
c*c%mo*a%mo;
else
return
c*c%mo;
}
long
long
work(
long
long
x)
{
if
(x==1)
return
0;
return
po(2,work(pi[x])+pi[x],x);
}
int
main()
{
memset
(f,1,
sizeof
f); f[1]=0; pi[1]=1;
for
(
int
i=2;i<=1e7;i++)
{
if
(f[i]) primes[++cnt]=i,pi[i]=i-1;
for
(
int
j=1;j<=cnt && i*primes[j]<=1e7;j++)
{
f[i*primes[j]]=0;
if
(i%primes[j]==0) {pi[i*primes[j]]=pi[i]*primes[j];
break
;}
else
pi[i*primes[j]]=pi[i]*pi[primes[j]];
}
}
scanf
(
"%d"
,&T);
while
(T--)
{
scanf
(
"%lld"
,&p);
printf
(
"%lld\n"
,work(p));
}
return
0;
}