名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

No.250 atetubouのzetubou

No.250 atetubouのzetubou - yukicoder

難しかったです…。


見たことあるような感じだったんですが、どうも組み合わせの数が合わないと思って解説を読んだら、自分が考えた組み合わせがめちゃくちゃだったみたいですね…。(小さいケースで全部試してみて、数の計算をしてみたけどだめ)


本質的には重複組み合わせの問題でした。


重複組合せと気付けば指定回数と比べてすぐ、とおもいきや10^15超えた時の処理などがおかしく、なかなかAC出来ませんでした。
最初C++で組んでいたのですが、打ち切り処理などが甘く、結局Pythonを使って階乗のリストを作り、計算しました。多倍長ってすげー


他の人の回答を見ると、パスカルの三角形みたいにして、組み合わせを求めておいて、大きすぎるものは全てINFにしてしまう、みたいな方法が取れるみたいです。賢いなあ。(自分には出来なかった)
この方法でもまた解き直してみたいですね。


それとそもそも自分でfact求めなくても、math.factorialを使えば階乗求まるので、ライブラリの知識も甘いなあと実感させられたのでした。

math.factorical使った版。ただ、毎回計算を呼び出すので遅い。。。
#82094 No.250 atetubouのzetubou - yukicoder


自分で階乗求めたバージョンの解答。Python3です。

#80851 No.250 atetubouのzetubou - yukicoder

def solve():
    fact = [1]*3001
    s = 1
    for i in range(1, 3001):
        s *= i
        fact[i] = s

    for i in range(int(input())):
        d, x, t = map(int, input().split())
        n = (d + x - 1)
        r = x if (n//2 > x) else (n - x)
        ans = fact[n] // (fact[n - r] * fact[r])
        """
        print(list(str(ans)))
        print(list(str(t)))
        print(n, r, n-r)
        """
        print("AC" if ans <= t else "ZETUBOU")


if __name__=="__main__":
    solve()