版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/88719977
求
根据扩展欧拉定理
根据第三条性质,我们就可以递归求
设 ,得到
用线性筛即可
#include<cstdio>
using namespace std;
const int N=1e7;
int t,phi[N+1],v[N+1],prime[N+1],m,p;
inline long long ksm (long long x,int y,int P)
{
long long ans=1;
for(;y;y>>=1,(x*=x)%=P) if(y&1) (ans*=x)%=P;
return ans%p;
}
inline int solve(int x)
{
if(x==1) return 0;
return ksm(2,solve(phi[x])+phi[x],x);
}
signed main()
{
scanf("%d",&t);
phi[1]=1;
for(register int i=2;i<=N;i++)
{
if(!v[i])
{
v[i]=i;prime[++m]=i;
phi[i]=i-1;
}
for(register int j=1;j<=m;j++)
{
if(prime[j]>v[i]||prime[j]*i>N) break;
v[i*prime[j]]=prime[j];
phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
}
}
while(t--)
{
scanf("%d",&p);
printf("%d\n",solve(p));
}
}