【競プロ典型90問】「085 - Multiplication 085(★4)」解法
Free-PhotosによるPixabayからの画像

問題

085 - Multiplication 085(★4)

ポイント

a,b,cの候補を全探索していきますが、実直に全てのパターンを試すとTLEとなってしまいます。

そこで、問題文から得られるaは√k以下、bはa以上という制約を利用して全探索の範囲を絞ることで時間内に探索を終えることができます。

以上を踏まえ、実装したコードがこちらです。

コード

def main():
    import sys
    sys.setrecursionlimit(10 ** 9)
    input = sys.stdin.readline

    K = int(input())

    # aとbの候補を格納する
    divisors = set()
    for d1 in range(1, int(K**0.5)+1):  # aは√k以下
        if K % d1 != 0:
            continue
        else:
            divisors.add(d1)  # a
            divisors.add(K // d1)  # b

    ans = 0
    divisors = sorted(divisors)  # a<=b<=cの制約があるため一度ソートする

    # 条件を満たすa,b,cを探索する
    for i in range(len(divisors)):
        for j in range(i, len(divisors)):  # bはa以上
            a = divisors[i]
            b = divisors[j]
            if K % (a * b) != 0:  # a*bで割り切れなければ次のループ
                continue
            else:
                c = K // (a * b)
                if a <= b <= c:
                    ans += 1

    print(ans)


if __name__ == '__main__':
    main()
おすすめの記事