题目描述
一句话题意:
222… mod p2^{2^{2^{\dots}}}\bmod p222…modp
输入格式
第一行一个整数T,表示数据个数。
接下来T行,每行一个正整数p,代表你需要取模的值
输出格式
T行,每行一个正整数,为答案对p取模后的值
输入输出样例
输入 #1
3
2
3
6
输出 #1
0
1
4
说明/提示
对于100%的数据,T≤1000,p≤107T\le 1000,p \le 10^7T≤1000,p≤107
解释:很明显递归欧拉降幂,na mod m=na mod Φ(m)+Φ(m) mod m,m>Φ(m)时n^a \bmod m=n^{a \bmod \Phi(m)+ \Phi(m)} \bmod m,m>\Phi(m)时namodm=namodΦ(m)+Φ(m)modm,m>Φ(m)时
这里我们递归递归进行,直到a mod Φ(m)=0a \bmod \Phi(m)=0amodΦ(m)=0 就可以出结果
#include<iostream>
#define ll long long
using namespace std;
ll ou(ll n){
ll ret=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ret=ret-ret/i;
while(n%i==0) n/=i;
}
}
if(n!=1) ret=ret-ret/n;
return ret;
}
ll pow(ll a,ll b,ll mod){
ll ret=1;
while(b){
if(b&1) ret=ret*a%mod;
b>>=1;a=a*a%mod;
}
return ret;
}
bool check(ll x){
int sum=0;
while(x){
if(x&1) sum++;
x>>=1;
}
return sum==1;
}
ll ok(ll mod){
if(check(mod)) return 0;
ll sum=ou(mod);
return pow(2,ok(sum)+sum,mod);
}
int T=0;
int main(){
cin>>T;
while(T--){
ll n;cin>>n;
cout<<ok(n)<<endl;
}
return 0;
}