#include using namespace std; const long MODULO=998244353L; long modpow(long a, long n){ long ans=1L; while(n){ if(n&1L){ ans*=a; ans%=MODULO; } a=a*a%MODULO; n>>=1; } return ans; } map divisors(long n){ map M; long i=2L; while(i*i<=n){ if(n%i==0){ M[i]++; n/=i; }else{ i++; } } if(n>1L){ M[n]++; } return M; } long num_of_divisors(const map& M){ long ans=1L; for(auto m:M){ ans*=(m.second+1); } return ans; } long num_of_divisors(long n){ return num_of_divisors(divisors(n)); } int main(){ long n,m; cin >> n >> m; //mの約数を取得(数列の要素の候補) map M=divisors(m); vector V; for(auto m:M){ V.push_back(m.first); } long k=(long)V.size(); //mの約数の組み合わせは「mの約数の個数」のn乗 //但し、最小公倍数がm未満になる場合もあるので、+=する。 //例:M=12の場合 //「最小公倍数が12の約数」-「最小公倍数が6の約数」-「最小公倍数が4の約数」+「最小公倍数が2の約数」 long ans=0L; for(long j=0L;j<(1L<