#include using namespace std; #include using namespace atcoder; using ll=long long; using Graph=vector>; #define INF 1000000000000000000 #define MOD 1000000007 #define MAX 500 int main(){ int N; ll M; cin>>N>>M; ll ans=1; for(ll p=2;p*p<=M;p++){ int cnt=0; while(M%p==0){ cnt++; M/=p; } if(cnt==0){ continue; } vector> dp(N,vector(cnt+1,0)); for(int j=0;j<=cnt;j++){ dp[0][j]=1; } for(int i=0;i0;j--){ dp[i+1][j-1]+=dp[i+1][j]; } for(int j=0;j<=cnt;j++){ dp[i+1][j]%=MOD; } } ll sum=0; for(int j=0;j<=cnt;j++){ sum+=dp[N-1][j]; sum%=MOD; } ans*=sum; ans%=MOD; } if(M>1){ int cnt=1; vector> dp(N,vector(cnt+1,0)); for(int j=0;j<=cnt;j++){ dp[0][j]=1; } for(int i=0;i0;j--){ dp[i+1][j-1]+=dp[i+1][j]; } for(int j=0;j<=cnt;j++){ dp[i+1][j]%=MOD; } } ll sum=0; for(int j=0;j<=cnt;j++){ sum+=dp[N-1][j]; sum%=MOD; } ans*=sum; ans%=MOD; } cout<