题目大意
求 2 2 2 2 2 2 2 2 2 2 … m o d p 2^{2^{2^{2^{2^{2^{2^{2^{2^{2^{^{…}}}}}}}}}}}mod p 2222222222…mod p
题目分析
乍看之下
这道题似乎
十分奇怪
所以说
我们要
祭出一个
叫做
扩展欧拉定理
的定理
直接代入公式递归即可
Code
#include<iostream>
#include<cstdio>
using namespace std;
long long n,t;
long long fai(long long x){//欧拉函数
long long res=x;
for(long long i=2;i*i<=x;++i){
if(x%i==0){
res=res/i*(i-1);
while(x%i==0) x/=i;
}
}
if(x>1) res=res/x*(x-1);
return res;
}
long long ksm(long long x,long long y,long long p){//快速幂
long long res=1;
while(y){
if(y&1) res=x*res%p;
x=x*x%p;
y/=2;
}
return res%p;
}
long long solve(long long x){//对单个x输出结果
if(x==1) return 0;
long long cnt=fai(x);
return (ksm(2,solve(cnt)+cnt,x));
}
int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
printf("%lld\n",solve(n));//输出
}
return 0;
}