const int MOD = 1e9 + 7;template <class T>class Math { public: vector<T> fact, invfact; // Math<datatype> objname(n); use like this Math() {} Math(int n) { fact.resize(n); invfact.resize(n); fact[0] = invfact[0] = 1; for (int i = 1; i < n; i++) { fact[i] = modmul(i, fact[i - 1]); invfact[i] = modinv(fact[i]); } } T binpow(T a, T b, T m = MOD) { T res = 1; while (b > 0) { if (b & 1) res = modmul(res, a, m); a = modmul(a, a, m); b >>= 1; } return res; } T modadd(T a, T b, T m = MOD) { a = a % m; b = b % m; return (((a + b) % m) + m) % m; } T modsub(T a, T b, T m = MOD) { a = a % m; b = b % m; return (((a - b) % m) + m) % m; } T modmul(T a, T b, T m = MOD) { a = a % m; b = b % m; return (((T)a * (T)b % m) + m) % m; } T modpow(T x, T y, T m = MOD) { T res = 1; x = x % m; while (y > 0) { if (y & 1) res = (res * x) % m; y = y >> 1; x = (x * x) % m; } return res; } T modinv(T x, T m = MOD) { return modpow(x, m - 2, m); } T choose(T n, T k) { if (k < 0 || k > n) return 0; T ans = fact[n]; ans = modmul(ans, invfact[k]); ans = modmul(ans, invfact[n - k]); return ans; }};