// compile: make data
// run: ./data < data.in
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#ifdef LOCAL
#include <debug/codeforces.h>
#define debug(x...) _debug_print(#x, x);
#define Debug(x...) _debug_print_format(#x, x);
std::ifstream terminal("/dev/tty");
#define PP cerr<<"\033[1;30mpause...\e[0m",terminal.ignore();
#else
#define debug(x...)
#define Debug(x...)
#define PP
#endif
template<typename...Args> void print_(Args...args){((cout<<args<<" "),...)<<endl;}
#define VI vector<int>
#define VII vector<vector<int>>
#define VIII vector<vector<vector<int>>>
#define rep(i,a,b) for(int i=(a);i<(int)(b);++i)
#define sz(v) ((int)(v).size())
#define print(...) print_(__VA_ARGS__);
#define FIND(a, x) ((find(a.begin(),a.end(),(x))!=a.end())?1:0)
#define cmin(x,...) x=min({(x), __VA_ARGS__})
#define cmax(x,...) x=max({(x), __VA_ARGS__})
#define INTMAX (int)(9223372036854775807)
#define INF (int)(1152921504606846976)
#define NaN (int)(0x8b88e1d0595d51d1)
#define double long double
#define int long long
#define uint unsigned long long
#define MAXN 200010
namespace mathlib {
namespace internal {
#ifndef _MSC_VER
template <class T> using is_signed_int128 = typename std::conditional<std::is_same<T, __int128_t>::value || std::is_same<T, __int128>::value, std::true_type, std::false_type>::type;
template <class T> using is_unsigned_int128 = typename std::conditional<std::is_same<T, __uint128_t>::value || std::is_same<T, unsigned __int128>::value, std::true_type, std::false_type>::type;
template <class T> using make_unsigned_int128 = typename std::conditional<std::is_same<T, __int128_t>::value, __uint128_t, unsigned __int128>;
template <class T> using is_integral = typename std::conditional<std::is_integral<T>::value || is_signed_int128<T>::value || is_unsigned_int128<T>::value, std::true_type, std::false_type>::type;
template <class T> using is_signed_int = typename std::conditional<(is_integral<T>::value && std::is_signed<T>::value) || is_signed_int128<T>::value, std::true_type, std::false_type>::type;
template <class T> using is_unsigned_int = typename std::conditional<(is_integral<T>::value && std::is_unsigned<T>::value) || is_unsigned_int128<T>::value, std::true_type, std::false_type>::type;
template <class T> using to_unsigned = typename std::conditional< is_signed_int128<T>::value, make_unsigned_int128<T>, typename std::conditional<std::is_signed<T>::value, std::make_unsigned<T>, std::common_type<T>>::type>::type;
#else
template <class T> using is_integral = typename std::is_integral<T>;
template <class T> using is_signed_int = typename std::conditional<is_integral<T>::value && std::is_signed<T>::value, std::true_type, std::false_type>::type;
template <class T> using is_unsigned_int = typename std::conditional<is_integral<T>::value && std::is_unsigned<T>::value, std::true_type, std::false_type>::type;
template <class T> using to_unsigned = typename std::conditional<is_signed_int<T>::value, std::make_unsigned<T>, std::common_type<T>>::type;
#endif
template <class T> using is_signed_int_t = std::enable_if_t<is_signed_int<T>::value>;
template <class T> using is_unsigned_int_t = std::enable_if_t<is_unsigned_int<T>::value>;
template <class T> using to_unsigned_t = typename to_unsigned<T>::type;
constexpr long long safe_mod(long long x, long long m) {x %= m; if (x < 0) x += m; return x; }
struct barrett {
unsigned int _m;
unsigned long long im;
explicit barrett(unsigned int m) : _m(m), im((unsigned long long)(-1) / m + 1) {}
unsigned int umod() const { return _m; }
unsigned int mul(unsigned int a, unsigned int b) const {
unsigned long long z = a;
z *= b;
#ifdef _MSC_VER
unsigned long long x;
_umul128(z, im, &x);
#else
unsigned long long x = (unsigned long long)(((unsigned __int128)(z)*im) >> 64);
#endif
unsigned long long y = x * _m;
return (unsigned int)(z - y + (z < y ? _m : 0));
}
};
constexpr std::pair<long long, long long> inv_gcd(long long a, long long b) {
a = safe_mod(a, b);
if (a == 0) return {b, 0};
long long s = b, t = a;
long long m0 = 0, m1 = 1;
while (t) {
long long u = s / t;
s -= t * u;
m0 -= m1 * u;
auto tmp = s;
s = t;
t = tmp;
tmp = m0;
m0 = m1;
m1 = tmp;
}
if (m0 < 0) m0 += b / s;
return {s, m0};
}
constexpr long long pow_mod_constexpr(long long x, long long n, int m) {
if (m == 1) return 0;
unsigned int _m = (unsigned int)(m);
unsigned long long r = 1;
unsigned long long y = safe_mod(x, m);
while (n) {if (n & 1) r = (r * y) % _m; y = (y * y) % _m; n >>= 1; }
return r;
}
constexpr bool is_prime_constexpr(int n) {
if (n <= 1) return false;
if (n == 2 || n == 7 || n == 61) return true;
if (n % 2 == 0) return false;
long long d = n - 1;
while (d % 2 == 0) d /= 2;
constexpr long long bases[3] = {2, 7, 61};
for (long long a : bases) {
long long t = d;
long long y = pow_mod_constexpr(a, t, n);
while (t != n - 1 && y != 1 && y != n - 1) {y = y * y % n; t <<= 1; }
if (y != n - 1 && t % 2 == 0) return false;
}
return true;
}
template <int n> constexpr bool is_prime = is_prime_constexpr(n);
struct modint_base {};
struct static_modint_base : modint_base {};
template <class T> using is_modint = std::is_base_of<modint_base, T>;
template <class T> using is_modint_t = std::enable_if_t<is_modint<T>::value>;
}
template <int m, std::enable_if_t<(1 <= m)>* = nullptr>
struct static_modint : internal::static_modint_base {
using mint = static_modint;
public:
static constexpr int mod() { return m; }
static mint raw(int v) {mint x; x._v = v; return x; }
static_modint() : _v(0) {}
template <class T, internal::is_signed_int_t<T>* = nullptr>
static_modint(T v) {long long x = (long long)(v % (long long)(umod())); if (x < 0) x += umod(); _v = (unsigned int)(x); }
template <class T, internal::is_unsigned_int_t<T>* = nullptr>
static_modint(T v) {_v = (unsigned int)(v % umod()); }
unsigned int val() const { return _v; }
mint& operator++() {_v++; if (_v == umod()) _v = 0; return *this; }
mint& operator--() {if (_v == 0) _v = umod(); _v--; return *this; }
mint operator++(int32_t) {mint result = *this; ++*this; return result; }
mint operator--(int32_t) {mint result = *this; --*this; return result; }
mint& operator+=(const mint& rhs) {_v += rhs._v; if (_v >= umod()) _v -= umod(); return *this; }
mint& operator-=(const mint& rhs) {_v -= rhs._v; if (_v >= umod()) _v += umod(); return *this; }
mint& operator*=(const mint& rhs) {unsigned long long z = _v; z *= rhs._v; _v = (unsigned int)(z % umod()); return *this; }
mint& operator/=(const mint& rhs) {return *this = *this * rhs.inv(); }
mint operator+() const { return *this; }
mint operator-() const { return mint() - *this; }
mint pow(long long n) const {
assert(0 <= n);
mint x = *this, r = 1;
while (n) {if (n & 1) r *= x; x *= x; n >>= 1; }
return r;
}
mint inv() const {
if (prime) {assert(_v); return pow(umod() - 2); }
else {auto eg = internal::inv_gcd(_v, m); assert(eg.first == 1); return eg.second; }
}
friend mint operator+(const mint& lhs, const mint& rhs) {return mint(lhs) += rhs; }
friend mint operator-(const mint& lhs, const mint& rhs) {return mint(lhs) -= rhs; }
friend mint operator*(const mint& lhs, const mint& rhs) {return mint(lhs) *= rhs; }
friend mint operator/(const mint& lhs, const mint& rhs) {return mint(lhs) /= rhs; }
friend bool operator==(const mint& lhs, const mint& rhs) {return lhs._v == rhs._v; }
friend bool operator!=(const mint& lhs, const mint& rhs) {return lhs._v != rhs._v; }
private:
unsigned int _v;
static constexpr unsigned int umod() { return m; }
static constexpr bool prime = internal::is_prime<m>;
};
};
using mint = mathlib::static_modint<1000000007>;
int32_t main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int n; cin >> n;
if (n & 1) {
cout << 0 << '\n';
return 0;
}
n >>= 1;
vector<mint> fact(2*n+1);
fact[0] = 1; rep(i, 1, 2*n+1) fact[i] = fact[i-1] * i;
auto comb = [&](int n, int k) {
mint res = fact[n];
res /= fact[k];
res /= fact[n-k];
return res;
};
mint ans = comb(2*n, n);
ans -= comb(2*n, n-1);
cout << ans.val() << endl;
return 0;
}
Ace58casino, that’s the one! Been hitting the tables here for a while now. Good payouts and some pretty sweet bonuses. You can get started at ace58casino.
Thomo fans, gà chọi c1 thomo seems to be the spot. Just passing it along, alright?
Q8Bet looks interesting. I wonder if there’s any relationship with any Qatari investments in sports! Anyway the site is smooth enough. Will check how’s their sports promotions and compare it with others. Worth a look: q8bet