結果
問題 |
No.895 MESE
|
ユーザー |
|
提出日時 | 2019-09-30 02:45:46 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,024 bytes |
コンパイル時間 | 90 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 29,472 KB |
最終ジャッジ日時 | 2024-10-03 04:50:48 |
合計ジャッジ時間 | 5,907 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 10 TLE * 1 -- * 15 |
ソースコード
# 二分乗数法 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) """ 今回の解法 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] tmp = 1 for i in range(2, 300000): tmp *= i tmp %= output_max my_fact.append(tmp) res = 0 for i in range(2, a+2): k = a + b + c - i tmp = 1 tmp = ((tmp << k) - 1) % output_max tmp = (tmp * my_fact[k - 1]) % output_max res += my_div(tmp, my_fact[a - i + 1], output_max) res %= output_max res = my_div(res, (my_fact[b - 1] * my_fact[c - 1]) % output_max, output_max) print(res)