結果
問題 | No.895 MESE |
ユーザー | MNGOF |
提出日時 | 2019-09-30 02:45:46 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,024 bytes |
コンパイル時間 | 90 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 29,472 KB |
最終ジャッジ日時 | 2024-10-03 04:50:48 |
合計ジャッジ時間 | 5,907 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 154 ms
27,776 KB |
testcase_01 | AC | 156 ms
22,656 KB |
testcase_02 | AC | 152 ms
22,400 KB |
testcase_03 | AC | 161 ms
22,400 KB |
testcase_04 | AC | 149 ms
22,656 KB |
testcase_05 | AC | 148 ms
22,528 KB |
testcase_06 | AC | 148 ms
22,400 KB |
testcase_07 | AC | 151 ms
22,528 KB |
testcase_08 | AC | 157 ms
22,400 KB |
testcase_09 | AC | 166 ms
22,528 KB |
testcase_10 | AC | 171 ms
22,656 KB |
testcase_11 | AC | 166 ms
22,528 KB |
testcase_12 | AC | 157 ms
22,528 KB |
testcase_13 | TLE | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
testcase_27 | -- | - |
testcase_28 | -- | - |
ソースコード
# 二分乗数法 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)