N,M = map(int,input().split()) P = 10 ** 9 + 7 div = [] i = 1 while i * i <= M: if M % i == 0: div.append(i) if i != M // i: div.append(M // i) i += 1 n = len(div) s = set(div) R = [[0] * n for _ in range(n)] for i in range(n): p = div[i] for j in range(n): q = div[j] if p * q in s: R[j][i] += 1 def seki(x,y): l = [[0] * n for _ in range(n)] for i in range(n): for j in range(n): for k in range(n): l[i][j] += x[i][k] * y[k][j] l[i][j] %= P return l e = [[0] * n for _ in range(n)] for i in range(n): e[i][i] = 1 u = N - 1 while u: if u & 1: e = seki(e,R) R = seki(R,R) u >>= 1 ans = 0 for i in range(n): for j in range(n): ans += e[i][j] ans %= P print(ans)