from functools import reduce
def primes_sieve(limit):
limitn = limit+1
not_prime = set()
primes = []
for i in range(2, limitn):
if i in not_prime:
continue
for f in range(i*2, limitn, i):
not_prime.add(f)
primes.append(i)
return primes
def FactorialFactorisation(n):
primeNumbers = primes_sieve(n)
len_list = len(primes_sieve(n))
factorization = [0]*(len_list+1)
for i in range(len_list):
power = 0
k = primeNumbers[i]
while n // k > 0:
power += n // k
k = k * primeNumbers[i]
factorization[i] = power
return factorization
def ListDifference(A, B):
return [i-j for i,j in zip(A,B)]
def BinomialFactorization(n,k):
N = FactorialFactorisation(n)
K = FactorialFactorisation(k)
K += [0]*(len(N)-len(K))
N_K = FactorialFactorisation(n-k)
N_K += [0]*(len(N)-len(N_K))
return ListDifference(ListDifference(N, K), N_K)
def SumOfDivisorsOfBinomial(n,k):
A = BinomialFactorization(n,k)
B = [x+1 for x in A]
return (reduce(lambda x, y: x * y, B))%1000000007
k, n = map(int, input().split())
print(SumOfDivisorsOfBinomial(n,k))
ZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQoKZGVmIHByaW1lc19zaWV2ZShsaW1pdCk6CiAgICBsaW1pdG4gPSBsaW1pdCsxCiAgICBub3RfcHJpbWUgPSBzZXQoKQogICAgcHJpbWVzID0gW10KCiAgICBmb3IgaSBpbiByYW5nZSgyLCBsaW1pdG4pOgogICAgICAgIGlmIGkgaW4gbm90X3ByaW1lOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBmb3IgZiBpbiByYW5nZShpKjIsIGxpbWl0biwgaSk6CiAgICAgICAgICAgIG5vdF9wcmltZS5hZGQoZikKCiAgICAgICAgcHJpbWVzLmFwcGVuZChpKQoKICAgIHJldHVybiBwcmltZXMKCgoKZGVmIEZhY3RvcmlhbEZhY3RvcmlzYXRpb24obik6CiAgICBwcmltZU51bWJlcnMgPSBwcmltZXNfc2lldmUobikKICAgIGxlbl9saXN0ID0gbGVuKHByaW1lc19zaWV2ZShuKSkKICAgIGZhY3Rvcml6YXRpb24gPSBbMF0qKGxlbl9saXN0KzEpCiAgICBmb3IgaSBpbiByYW5nZShsZW5fbGlzdCk6CiAgICAgICAgcG93ZXIgPSAwCiAgICAgICAgayA9IHByaW1lTnVtYmVyc1tpXSAKICAgICAgICB3aGlsZSBuIC8vIGsgPiAwOgogICAgICAgICAgICBwb3dlciArPSBuIC8vIGsKICAgICAgICAgICAgayA9IGsgKiBwcmltZU51bWJlcnNbaV0KICAgICAgICBmYWN0b3JpemF0aW9uW2ldID0gcG93ZXIKICAgIHJldHVybiBmYWN0b3JpemF0aW9uCgpkZWYgTGlzdERpZmZlcmVuY2UoQSwgQik6CiAgICByZXR1cm4gW2ktaiBmb3IgaSxqIGluIHppcChBLEIpXQoKZGVmIEJpbm9taWFsRmFjdG9yaXphdGlvbihuLGspOgogICAgTiA9IEZhY3RvcmlhbEZhY3RvcmlzYXRpb24obikKICAgIEsgPSBGYWN0b3JpYWxGYWN0b3Jpc2F0aW9uKGspCiAgICBLICs9IFswXSoobGVuKE4pLWxlbihLKSkKICAgIE5fSyA9IEZhY3RvcmlhbEZhY3RvcmlzYXRpb24obi1rKQogICAgTl9LICs9IFswXSoobGVuKE4pLWxlbihOX0spKQogICAgcmV0dXJuIExpc3REaWZmZXJlbmNlKExpc3REaWZmZXJlbmNlKE4sIEspLCBOX0spCgoKCmRlZiBTdW1PZkRpdmlzb3JzT2ZCaW5vbWlhbChuLGspOgogICAgQSA9IEJpbm9taWFsRmFjdG9yaXphdGlvbihuLGspCiAgICBCID0gW3grMSBmb3IgeCBpbiBBXQogICAgcmV0dXJuIChyZWR1Y2UobGFtYmRhIHgsIHk6IHggKiB5LCBCKSklMTAwMDAwMDAwNwoKCmssIG4gPSBtYXAoaW50LCBpbnB1dCgpLnNwbGl0KCkpCnByaW50KFN1bU9mRGl2aXNvcnNPZkJpbm9taWFsKG4saykp