gcd,快速幂,原根数
int gcd(int a,int b){ return b?gcd(b,a%b):a;}
void init(){
tot = 0;phi[1] = 1;
for(int i=2 ;i<A ;i++){
if(!vis[i]){pri[++tot] = i;phi[i] = i-1;}
for(int j=1 ;j<=tot&&i*pri[j]<A ;j++){
vis[i*pri[j]] = 1;
if(i%pri[j] == 0){
phi[i*pri[j]] = pri[j] * phi[i];break;
}
phi[i*pri[j]] = phi[pri[j]] * phi[i];
}
}
}
ll fast_pow(ll a,ll b){
ll res = 1;
while(b){
if(b&1) res = res*a%n;
a = a*a%n;
b >>= 1;
}
return res;
}