#pragma once
// totient function φ(N)=(1 ~ N , gcd(i,N) = 1)// {0, 1, 1, 2, 4, 2, 6, 4, ... }vector<int>EulersTotientFunction(intN){vector<int>ret(N+1,0);for(inti=0;i<=N;i++)ret[i]=i;for(inti=2;i<=N;i++){if(ret[i]==i)for(intj=i;j<=N;j+=i)ret[j]=ret[j]/i*(i-1);}returnret;}// Divisor ex) 12 -> {1, 2, 3, 4, 6, 12}vector<longlong>Divisor(longlongN){vector<longlong>v;for(longlongi=1;i*i<=N;i++){if(N%i==0){v.push_back(i);if(i*i!=N)v.push_back(N/i);}}returnv;}// Factorization// ex) 18 -> { (2,1) , (3,2) }vector<pair<longlong,int>>PrimeFactors(longlongN){vector<pair<longlong,int>>ret;for(longlongp=2;p*p<=N;p++)if(N%p==0){ret.emplace_back(p,0);while(N%p==0)N/=p,ret.back().second++;}if(N>=2)ret.emplace_back(N,1);returnret;}// Factorization with Prime Sieve// ex) 18 -> { (2,1) , (3,2) }vector<pair<longlong,int>>PrimeFactors(longlongN,constvector<longlong>&prime){vector<pair<longlong,int>>ret;for(auto&p:prime){if(p*p>N)break;if(N%p==0){ret.emplace_back(p,0);while(N%p==0)N/=p,ret.back().second++;}}if(N>=2)ret.emplace_back(N,1);returnret;}// modpow for mod < 2 ^ 31longlongmodpow(longlonga,longlongn,longlongmod){a%=mod;longlongret=1;while(n>0){if(n&1)ret=ret*a%mod;a=a*a%mod;n>>=1;}returnret%mod;};// Check if r is Primitive RootboolisPrimitiveRoot(longlongr,longlongmod){r%=mod;if(r==0)returnfalse;autopf=PrimeFactors(mod-1);for(auto&x:pf){if(modpow(r,(mod-1)/x.first,mod)==1)returnfalse;}returntrue;}// Get Primitive RootlonglongPrimitiveRoot(longlongmod){if(mod==2)return1;longlongret=1;while(isPrimitiveRoot(ret,mod)==false)ret++;returnret;}// Euler's phi functionlonglongphi(longlongn){autopf=PrimeFactors(n);longlongret=n;for(autop:pf){ret/=p.first;ret*=(p.first-1);}returnret;}// Extended Euclidean algorithm// solve : ax + by = gcd(a, b)// return : pair(x, y)// a>=0,b>=0 でない場合 gcd(a, b) は負にもなり得るので注意pair<longlong,longlong>extgcd(longlonga,longlongb){if(b==0)returnmake_pair(1,0);longlongx,y;tie(y,x)=extgcd(b,a%b);y-=a/b*x;returnmake_pair(x,y);}// Check if n is Square Number// true : return d s.t. d * d == n// false : return -1longlongSqrtInt(longlongn){if(n==0||n==1)returnn;longlongd=(longlong)sqrt(n)-1;while(d*d<n)++d;return(d*d==n)?d:-1;}// return a number of n's digit// zero ... return value if n = 0 (default -> 1)intisDigit(longlongn,intzero=1){if(n==0)returnzero;intret=0;while(n){n/=10;ret++;}returnret;}
#line 2 "math/elementary-function.hpp"
// totient function φ(N)=(1 ~ N , gcd(i,N) = 1)// {0, 1, 1, 2, 4, 2, 6, 4, ... }vector<int>EulersTotientFunction(intN){vector<int>ret(N+1,0);for(inti=0;i<=N;i++)ret[i]=i;for(inti=2;i<=N;i++){if(ret[i]==i)for(intj=i;j<=N;j+=i)ret[j]=ret[j]/i*(i-1);}returnret;}// Divisor ex) 12 -> {1, 2, 3, 4, 6, 12}vector<longlong>Divisor(longlongN){vector<longlong>v;for(longlongi=1;i*i<=N;i++){if(N%i==0){v.push_back(i);if(i*i!=N)v.push_back(N/i);}}returnv;}// Factorization// ex) 18 -> { (2,1) , (3,2) }vector<pair<longlong,int>>PrimeFactors(longlongN){vector<pair<longlong,int>>ret;for(longlongp=2;p*p<=N;p++)if(N%p==0){ret.emplace_back(p,0);while(N%p==0)N/=p,ret.back().second++;}if(N>=2)ret.emplace_back(N,1);returnret;}// Factorization with Prime Sieve// ex) 18 -> { (2,1) , (3,2) }vector<pair<longlong,int>>PrimeFactors(longlongN,constvector<longlong>&prime){vector<pair<longlong,int>>ret;for(auto&p:prime){if(p*p>N)break;if(N%p==0){ret.emplace_back(p,0);while(N%p==0)N/=p,ret.back().second++;}}if(N>=2)ret.emplace_back(N,1);returnret;}// modpow for mod < 2 ^ 31longlongmodpow(longlonga,longlongn,longlongmod){a%=mod;longlongret=1;while(n>0){if(n&1)ret=ret*a%mod;a=a*a%mod;n>>=1;}returnret%mod;};// Check if r is Primitive RootboolisPrimitiveRoot(longlongr,longlongmod){r%=mod;if(r==0)returnfalse;autopf=PrimeFactors(mod-1);for(auto&x:pf){if(modpow(r,(mod-1)/x.first,mod)==1)returnfalse;}returntrue;}// Get Primitive RootlonglongPrimitiveRoot(longlongmod){if(mod==2)return1;longlongret=1;while(isPrimitiveRoot(ret,mod)==false)ret++;returnret;}// Euler's phi functionlonglongphi(longlongn){autopf=PrimeFactors(n);longlongret=n;for(autop:pf){ret/=p.first;ret*=(p.first-1);}returnret;}// Extended Euclidean algorithm// solve : ax + by = gcd(a, b)// return : pair(x, y)// a>=0,b>=0 でない場合 gcd(a, b) は負にもなり得るので注意pair<longlong,longlong>extgcd(longlonga,longlongb){if(b==0)returnmake_pair(1,0);longlongx,y;tie(y,x)=extgcd(b,a%b);y-=a/b*x;returnmake_pair(x,y);}// Check if n is Square Number// true : return d s.t. d * d == n// false : return -1longlongSqrtInt(longlongn){if(n==0||n==1)returnn;longlongd=(longlong)sqrt(n)-1;while(d*d<n)++d;return(d*d==n)?d:-1;}// return a number of n's digit// zero ... return value if n = 0 (default -> 1)intisDigit(longlongn,intzero=1){if(n==0)returnzero;intret=0;while(n){n/=10;ret++;}returnret;}