結果
問題 | No.895 MESE |
ユーザー | MNGOF |
提出日時 | 2019-09-30 02:01:43 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,127 bytes |
コンパイル時間 | 91 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 17,700 KB |
最終ジャッジ日時 | 2024-10-03 04:48:35 |
合計ジャッジ時間 | 5,127 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 30 ms
15,744 KB |
testcase_01 | AC | 33 ms
10,624 KB |
testcase_02 | AC | 39 ms
10,624 KB |
testcase_03 | AC | 31 ms
10,624 KB |
testcase_04 | AC | 30 ms
10,624 KB |
testcase_05 | AC | 30 ms
10,624 KB |
testcase_06 | AC | 30 ms
10,624 KB |
testcase_07 | AC | 30 ms
10,624 KB |
testcase_08 | AC | 172 ms
10,752 KB |
testcase_09 | AC | 184 ms
10,624 KB |
testcase_10 | AC | 321 ms
10,624 KB |
testcase_11 | AC | 356 ms
10,752 KB |
testcase_12 | AC | 129 ms
10,496 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) 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 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)! """ # 入力の分解 # str = input() 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] 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)) % output_max res += my_div(tmp, my_fact(a - i + 1, output_max), output_max) res %= output_max res = my_div(res, (my_fact(b - 1, output_max) * my_fact(c - 1, output_max)) % output_max, output_max) print(res)