# 二分乗数法 def my_dif(a, b, m): # a-b tmp = a - b return tmp if tmp > 0 else tmp + m def my_pow(a, n, m, r=1): # [a, n, m, r] = [底, 指数, 返値の最大値, 初項] a %= m if n % 2 == 1: r *= a r %= m if n <= 1: return r a *= a a %= m return my_pow(a, int(n / 2), m, r) def my_mul(a, b, m): # a*b return ((a % m) * (b % m)) % m def my_div(a, b, m): # a/b return my_mul(a, my_pow(b, m - 2, m), m) # def my_fact(n, m): # # n!の計算 # # n! を単純に計算 # if n > 1: # a = 1 # for i in range(n): # a *= i + 1 # a %= m # return a # else: # return 1 """ 今回の解法 Xの1の位置をX, YZも同様に表記する。 x=110000, Y=0011000, Z= 0000111 ならば XXYYZZZ と表記 a=b=2, c=3のとき、x>y>zより、XY-----, XXY----, ...となる。(-にはXYZの任意の文字) -----に3つ1 5C3=10通り, 全部同じ数だけある ----に3つ1 これらを全部足す(---で1が3つはこれに含む) この場合は*2 (0にX1個Y1個はいる*入れ替え) 00111 01011 10011 01101 10101 11001 01110 10110 11010 11100 オール1が6*2個(4C2*2個)できた=(2^5-1)*6*2 (最後の2は2!/(1!1!)) 4C2=右端の1を固定して0を動かす 0000は3C1でオール1が3個できる=(2^4-1)*3*1 一般化すると i =2~a+b-1 => (a-i+1)!があるからi=2~a+1まで, Xを1個増やすと総和が1つ増えるため. K = a+b+c-i Σ(2^K-1)*(K-1)C(K-c)*(a+b-i)!/(a-i+1)!(b-1)! =Σ(2^K-1)*(a+b+c-i-1)!/{(a-i+1)!(b-1)!(c-1)!} ={Σ(2^K-1)*(a+b+c-i-1)!/(a-i+1)!} / (b-1)!(c-1)! """ output_max = 1000000000 + 7 s = input() s = s.split() inp = [int(tmp) for tmp in s] a = inp[0] b = inp[1] c = inp[2] # 階乗のチートシート作成 my_fact = [-1, 1, 1] tmp = 1 for i in range(2, 300000): tmp *= i tmp %= output_max my_fact.append(tmp) # 2のべき乗のチートシート作成 my_2xp = [1] tmp = 1 for i in range(1, 300000): tmp *= 2 tmp %= output_max my_2xp.append(tmp) res = 0 k = a + b + c - 1 for i in range(0, a): k -= 1 tmp = my_2xp[k] - 1 tmp = (tmp * my_fact[k]) % output_max res += my_div(tmp, my_fact[a - i], output_max) res %= output_max res = my_div(res, (my_fact[b] * my_fact[c]) % output_max, output_max) print(res)