#include <iostream>
using namespace std;
typedef long long LL;
const int N = 2000010, mod = 1000000007;
int primes[N], cnt;
int powers[N];
bool st[N];
//素数打表 接近于O(n)
void get_primes(int n)
{
int s = 0;
for (int i = 2; i <= n; i ++ )
if (!st[i])
{
primes[cnt ++ ] = i;
for (int j = i * 2; j <= n; j += i)
{
st[j] = true;
s ++ ;
}
}
}
//求n!的因数p的个数 因为p的倍数的个数 + p^2的倍数的个数 + p^3的倍数的个数 + … 是因子p的个数。
int get(int n, int p)
{
int s = 0;
while (n > 0)
{
s += n / p;
n /= p;
}
return s;
}
int main()
{
int n, s;
cin >> n >> s;
if (s > n) cout << 0 << endl;
else
{
get_primes(n);
//C(p,m) 转化为求各质因数的乘积 先计算每个可表示为2**x+3**y+...5**z+..+....
for (int i = 0; i < cnt; i ++ )
{
int p = primes[i];
powers[i] += get(n, p) - get(s, p) - get(n - s, p);
}
//统计C(p,m)
int res = 1;
for (int i = 0; i < cnt; i ++ )
{
int p = primes[i];
while (powers[i] -- ) res = (LL)res * p % mod;
}
for (int i = 0; i < n - s; i ++ ) res = res * 2 % mod;
cout << res << endl;
}
return 0;
}