結果
問題 | No.895 MESE |
ユーザー | MNGOF |
提出日時 | 2019-09-30 03:53:32 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
AC
|
実行時間 | 1,835 ms / 2,000 ms |
コード長 | 2,356 bytes |
コンパイル時間 | 258 ms |
コンパイル使用メモリ | 12,544 KB |
実行使用メモリ | 34,432 KB |
最終ジャッジ日時 | 2024-10-03 04:55:16 |
合計ジャッジ時間 | 30,612 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 261 ms
34,304 KB |
testcase_01 | AC | 260 ms
34,304 KB |
testcase_02 | AC | 263 ms
34,432 KB |
testcase_03 | AC | 261 ms
34,432 KB |
testcase_04 | AC | 255 ms
34,304 KB |
testcase_05 | AC | 265 ms
34,432 KB |
testcase_06 | AC | 269 ms
34,432 KB |
testcase_07 | AC | 270 ms
34,432 KB |
testcase_08 | AC | 279 ms
34,304 KB |
testcase_09 | AC | 275 ms
34,432 KB |
testcase_10 | AC | 284 ms
34,432 KB |
testcase_11 | AC | 281 ms
34,304 KB |
testcase_12 | AC | 273 ms
34,304 KB |
testcase_13 | AC | 783 ms
34,176 KB |
testcase_14 | AC | 1,605 ms
34,432 KB |
testcase_15 | AC | 1,637 ms
34,304 KB |
testcase_16 | AC | 1,102 ms
34,304 KB |
testcase_17 | AC | 408 ms
34,304 KB |
testcase_18 | AC | 1,790 ms
34,304 KB |
testcase_19 | AC | 1,835 ms
34,304 KB |
testcase_20 | AC | 1,792 ms
34,432 KB |
testcase_21 | AC | 1,786 ms
34,304 KB |
testcase_22 | AC | 1,806 ms
34,176 KB |
testcase_23 | AC | 1,818 ms
34,304 KB |
testcase_24 | AC | 1,811 ms
34,176 KB |
testcase_25 | AC | 1,822 ms
34,176 KB |
testcase_26 | AC | 1,814 ms
34,304 KB |
testcase_27 | AC | 1,803 ms
34,304 KB |
testcase_28 | AC | 1,820 ms
34,176 KB |
ソースコード
# 二分乗数法 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)