#include using namespace std; constexpr int mod = 1e9 + 7; struct Mint { int v; Mint(long long a = 0) : v((a %= mod) < 0 ? a + mod : a) {} Mint& operator*=(Mint r) { v = (long long)v * r.v % mod; return *this; } Mint& operator/=(Mint r) { return *this *= r.inv(); } Mint& operator+=(Mint r) { if ((v += r.v) >= mod) v -= mod; return *this; } Mint& operator-=(Mint r) { if ((v -= r.v) < 0) v += mod; return *this; } friend Mint operator*(Mint l, Mint r) { return l *= r; } friend Mint operator/(Mint l, Mint r) { return l /= r; } friend Mint operator+(Mint l, Mint r) { return l += r; } friend Mint operator-(Mint l, Mint r) { return l -= r; } Mint pow(long long n) const { Mint res = 1; for (Mint t = *this; n; t *= t, n >>= 1) if (n & 1) res *= t; return res; } Mint inv() const { return pow(mod - 2); } friend string to_string(Mint a) { return to_string(a.v); } }; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int a, b, c; cin >> a >> b >> c; int n = a + b + c + 1; vector fact(n + 1, 1), finv(n + 1), pow2(n + 1, 1); for (int i = 1; i <= n; ++i) { fact[i] = i * fact[i - 1]; pow2[i] = 2 * pow2[i - 1]; } finv[n] = fact[n].inv(); for (int i = n; i >= 1; --i) { finv[i - 1] = i * finv[i]; } --n; auto comb = [&](int n, int k) -> Mint { if (k < 0 or k > n) { return 0; } return fact[n] * finv[k] * finv[n - k]; }; Mint inv2 = Mint(2).inv(); Mint res; for (int S = 0; S < 1 << 3; ++S) { int x = a - (S >> 0 & 1); int y = b - (S >> 1 & 1); int z = c - (S >> 2 & 1); Mint crr, sum; for (int i = n; i >= 0; --i) { sum = comb(n + 1, i + 1) * pow2[n] - sum * inv2; int sgn = 3 * i - (x + y + z) & 1 ? -1 : 1; crr += sgn * comb(i, x) * comb(i, y) * comb(i, z) * sum; } if (__builtin_popcount(S) & 1) { res -= crr; } else { res += crr; } } cout << res.v << '\n'; }