题解:
这道题是一道函数构造题,详细可以看这个博客讲的很清楚。
代码如下:
#include<cstdio>
#include<string>
#include<cmath>
#include<map>
using namespace std;
int T;
long long n;
map <long long,long long> f;
long long eur(long long x){
long long ret=x;
for (int i=2;i<=sqrt(x)&&x>1;i++)
if (x%i==0) {ret=ret/i*(i-1); while (x%i==0) x/=i;}
if (x>1) ret=ret/x*(x-1);
return ret;
}
long long qsm(long long x,long long y,long long p){
long long ret=1,w=x%p;
while (y) {
if (y%2==1) ret=(ret*w)%p;
y=y/2; w=(w*w)%p;
}
return ret;
}
long long Fun(long long x){
if (f.count(x)) return f[x];
long long x1=eur(x);
return f[x]=qsm(2ll,Fun(x1)+x1,x);
}
int main(){
scanf("%d",&T);
while (T--) {
scanf("%lld",&n);
printf("%lld\n",Fun(n));
}
return 0;
}