#include long long mod_rev(long long x, long long mod) { long long i = 0; long long a = x; long long b = mod; long long pa[3] = {0, 1, 0}; long long pb[3] = {0, 0, 1}; for (;;) { long long q = a / b; long long r = a % b; pa[i] = pa[(i + 1) % 3] - q * pa[(i + 2) % 3]; pb[i] = pb[(i + 1) % 3] - q * pb[(i + 2) % 3]; if (!r) { long long rev = pa[(i + 2) % 3]; if (0 > rev) { rev += mod; } return rev; } a = b; b = r; i = (i + 1) % 3; } } long long calc(long long m, long long n) { const long long mod = 1000000007; long long x; long long total = 1; long long d = n - m; long long p = d < m ? d : m; long long q = d < m ? m : d; for (x = 2; x <= n; x++) { total = (total * x) % mod; } for (x = 2; x <= p; x++) { long long rev = mod_rev(x, mod); total = (total * rev) % mod; total = (total * rev) % mod; } for (; x <= q; x++) { long long rev = mod_rev(x, mod); total = (total * rev) % mod; } return total; }