#include<iostream>
using namespace std;
typedef unsigned long long ull;
ull sl(ull n, ull k, ull mod)
{
ull ans = 0;
while (k)
{
if (k & 1)ans = (ans + n) % mod;
k >>= 1, n = (n + n) % mod;
}
return ans;
}
ull qp(ull a, ull k, ull p)
{
ull res = 1;
while (k)
{
if (k & 1)res = sl(res, a, p);
k >>= 1; a = sl(a, a, p);
}
return res;
}
ull C(ull n, ull m,ull mod)
{
ull ans = 1;
for (ull i = 1; i <= m; i++) {
ans = (sl(ans , (n - m + i),mod) *qp(i,mod-2,mod))%mod;
}
return ans;
}
int main ()
{
ull n,m,mod=100000007;cin>>n>>m;
cout<<C(n,m,mod)<<endl;
}
LL qmi(LL a, LL k)
{
LL res = 1;
while (k)
{
if (k & 1)res = (LL)res * a % mod;
a = (LL)a * a % mod;
k >>= 1;
}
return res;
}
LL C(int a, int b)//自变量类型int
{
if (b > a)return 0;//漏了边界条件
LL res = 1;
// a!/(b!(a-b)!) = (a-b+1)*...*a / b! 分子有b项
for (int i = 1, j = a; i <= b; i++, j--)//i<=b而不是<
{
res = (LL)res * j % mod;
res = (LL)res * qmi(i, mod - 2) % mod;
}
return res;
}
ull qmi(ull a, ull k)
{
ull res = 1;
while (k)
{
if (k & 1)res = (ull)res * a % mod;
a = (ull)a * a % mod;
k >>= 1;
}
return res;
}
ull C(ull a, ull b)//自变量类型int
{
if (b > a)return 0;//漏了边界条件
ull res = 1;
// a!/(b!(a-b)!) = (a-b+1)*...*a / b! 分子有b项
for (int i = 1, j = a; i <= b; i++, j--)//i<=b而不是<
{
res = (ull)res * j % mod;
res = (ull)res * qmi(i, mod - 2) % mod;
}
return res;
}