#include<cstdio>
#include<vector>
#include<unordered_map>
#define MAXN 215444
using namespace std;
typedef long long ll;
int mo[MAXN],pre[MAXN];
bool flag[MAXN];
vector<int> prim;
unordered_map<int,int> mp;
inline ll power(ll x,int y){
ll res=1;
while(y){
if(y&1){
res*=x;
}
x*=x;
y>>=1;
}
return res;
}
inline void prework(){
mo[1]=1;
for(int i=2;i<MAXN;++i){
if(!flag[i]){
mo[i]=-1;
prim.push_back(i);
}
for(int j=0;j<prim.size()&&i*prim[j]<MAXN;++j){
flag[i*prim[j]]=true;
if(i%prim[j]){
mo[i*prim[j]]=-mo[i];
}else{
mo[i*prim[j]]=0;
break;
}
}
}
for(int i=1;i<MAXN;++i){
pre[i]=pre[i-1]+mo[i];
}
}
int mobius(int n){
if(n<MAXN){
return pre[n];
}
if(mp.count(n)){
return mp[n];
}
int res=1;
for(int l=1,r=0;l<=n;l=r+1){
r=n/(n/l);
res-=(r-l+1)*mobius(n/l);
}
return mp[n]=res;
}
int main(){
prework();
int n,m;
scanf("%d %d",&n,&m);
ll ans=0;
for(int i=1;i<=m;++i){
if(m%i==0){
ans+=(mobius(i)-mobius(i-1))*power(m/i,n);
}
}
printf("%lld",ans);
return 0;
}