const val MOD = 1_000_000_007 val MEM_CHOOSE = Array(2001) { LongArray(2000) { -1 } } val MEM_POW = LongArray(2001) { -1 } fun choose(n: Int, k: Int): Long { if (MEM_CHOOSE[n][k] != -1L) { return MEM_CHOOSE[n][k] } if (n == 1 || n == 0) { MEM_CHOOSE[n][k] == 1L return 1 } else if (k == 0) { MEM_CHOOSE[n][k] = 1 return 1 } else if (k == 1) { MEM_CHOOSE[n][k] = n.toLong() return n.toLong() } else if (k == n) { MEM_CHOOSE[n][k] = 1 return 1 } else if (k == n - 1) { MEM_CHOOSE[n][k] = n.toLong() return n.toLong() } else { val res = (choose(n - 1, k - 1) + choose(n - 1, k)) % MOD MEM_CHOOSE[n][k] = res return res } } fun powOf2(n: Int): Long { if (MEM_POW[n] != -1L) { return MEM_POW[n] } if (n == 0) { MEM_POW[n] = 1L return 1 } else { val res = (powOf2(n - 1) * 2) % MOD MEM_POW[n] = res return res } } fun modifier(k: Int): Long { return powOf2(k - 1) } fun main() = with(System.`in`.bufferedReader()) { val (n, k) = this.readLine().split(" ").map { it.toInt() } // val arr = this.readLine().split(" ").map { it.toInt() } println(choose(n, k) * modifier(k) % MOD) }