int gcd(
int a,
int b){
if(b ==
0)
return a;
return gcd(b,a%b);
}
int extgcd(
int a,
int b,
int &x,
int &y){
if(b ==
0){
x =
1; y =
0;
return a;
}
else{
int r = extgcd(b, a%b, x, y);
int t = x;
x = y;
y = t - (a/b)*y;
return r;
}
}
bool isPrime(
int n){
for(
int i =
2; i*i <= n; i++){
if(n%i ==
0)
return false;
}
return n !=
1;
}
vector<int> divisor(
int n){
vector<int> res;
for(
int i =
1; i*i <= n; i++){
if(n%i ==
0){
res.push_back(i);
if(i != n/i) res.push_back(n/i);
}
}
return res;
}
map<int, int> primeFactor(
int n){
map<int, int> res;
for(
int i =
2; i*i <= n; i++){
while(n%i ==
0){
++res[i];
n /= i;
}
}
if(n !=
1) res[n] =
1;
return res;
}
int prime[maxn];
int isPrime[maxn+
1];
int sieve(
int n){
int p =
0;
for(
int i =
0; i <= n; i++) isPrime[i] =
1;
isPrime[
0] = isPrime[
1] =
0;
for(
int i =
2; i <= n; i++){
if(isPrime[i]){
prime[p++] = i;
for(
int j =
2*i; j <= n; j += i){
isPrime[j] =
0;
}
}
}
return p;
}
typedef long long ll;
int isPrime[b-a];
int isPrimeB[sqrtb+
1]
void segmentSieve(ll a, ll b){
for(ll i =
0; i*i <= b; i++) isPrimeB[i] =
1;
for(ll i =
0; i < b-a; i++) isPrime[i] =
1;
for(ll i =
2; i*i < b; i++){
if(isPrimeB[i]){
for(ll j =
2*i; j*j < b; j += i){
isPrimeB[j] =
0;
}
for(ll j = max(
2ll,(a+i-
1)/i)*i; j < b; j += i){
isPrime[j-a] =
0;
}
}
}
}
typedef long long ll;
ll modPow(ll x, ll n, ll mod){
ll res =
1;
while(n >
0){
if(n &
1 ==
1) res = res*x % mod;
x = x*x % mod;
n = n >>
1;
}
return res;
}