#define _GLIBCXX_DEBUG
#include<bits/stdc++.h>
#include<algorithm>//next_permutation
#define rep(i,n) for (int i = 0;i < (n);i++)
#define all(v) v.begin(),v.end()
#define dec(n) cout << fixed << setprecision(n);
#define large "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#define small "abcdefghijklmnopqrstuvwxyz"
using namespace std;
using ll = long long;
using P = pair<ll,ll>;
using vl = vector<ll>;
using vvl = vector<vl>;

ll gcd(ll a,ll b){
  if(b == 0) return a;
  return gcd(b , a % b);
}

const ll MOD = 1000000007;
const ll MAX = 2000001;

ll mod(ll a){
  return a % MOD;
}

ll lcm(ll a,ll b){
  return (a*b)/gcd(a,b);
}

ll fac[MAX], finv[MAX], inv[MAX];

void nCrprep() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (ll i = 2; i < MAX; i++){
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}

ll nCr(ll n, ll r){
    if (n < r) return 0;
    if (n < 0 || r < 0) return 0;
    return fac[n] * (finv[r] * finv[n - r] % MOD) % MOD;
}

ll nCrcheep(ll n,ll r){
  if(r == 0) return 1;
  else if(r == 1) return n;
  else return nCrcheep(n-1,r-1)*n/r;
}

vector<pair<ll,ll>> prime_factorize(ll n){
  vector<pair<ll,ll>> res;
  
  for(ll i=2; i*i <= n; i++){
    if(n % i != 0) continue;
    
    ll ex = 0;
    while(n % i == 0){
      ex++;
      n /= i;
    }
    
    res.push_back({i,ex});
  }
  
  if(n != 1) res.push_back({n,1});
  
  return res;
  
}


int main(){
  ll n,m; cin >> n >> m; ll ans = 1;
  vl pown(60);
  
  nCrprep();
  
  pown[0] = 1;
  rep(i,59){
    pown[i+1] = mod(pown[i]*n);
  }
  
  auto res = prime_factorize(m);
    
  for(auto p : res){
    ll ind = p.second;
    ans *= nCr(n+ind-1,ind);
    ans = mod(ans);
  }
  
  
  cout << ans << endl;
  
  
}
#include <bits/stdc++.h>

#include <boost/range/adaptors.hpp>
#include <boost/range/irange.hpp>

using namespace std;
using namespace boost;
using namespace boost::adaptors;

int main() {
    int64_t n;
    cin >> n;

    string s;
    cin >> s;

    unordered_map<pair<string, string>, int64_t,
                  boost::hash<pair<string, string>>>
            m;
    for (auto u : irange(0uL, 1uL << n)) {
        bitset<18> bs(u);

        string s1, s2;
        for (auto i : irange(0L, n)) {
            if (bs[i]) {
                s1.push_back(s[i]);
            } else {
                s2.push_back(s[i]);
            }
        }

        ++m[make_pair(s1, s2)];
    }

    int64_t ans = 0;
    for (auto u : irange(0uL, 1uL << n)) {
        bitset<18> bs(u);

        string s1, s2;
        for (auto i : irange(n, 2 * n) | reversed) {
            if (bs[i - n]) {
                s1.push_back(s[i]);
            } else {
                s2.push_back(s[i]);
            }
        }

        ans += m[make_pair(s1, s2)];
    }

    cout << ans << endl;
}