オットセイの経営日誌

データサイエンス系ベンチャーを経営してます。経営のこと、趣味のことつぶやきます。

AtCoder Beginner Contest 169 (A~D)

D問題はさくっとACできるようになってきましたが、B問題でWA吐いて萎えています。。。

D問題までのPython ACコードです。

https://atcoder.jp/contests/abc169/tasks/abc169_a

import sys
sys.setrecursionlimit(10**6)

a, b = map(int, input().split())

print(a*b)

https://atcoder.jp/contests/abc169/tasks/abc169_b

import sys
sys.setrecursionlimit(10**6)

n = int(input())
A = list(map(int, input().split()))

ans = 1
m = 1e18

if 0 in A:
    print(0)
else:
    for a in A:
        ans *= a
        if ans > m:
            print(-1)
            break
    else:
        print(ans)

https://atcoder.jp/contests/abc169/tasks/abc169_c

"""
keyword: decimal
"""
import sys
sys.setrecursionlimit(10**6)

a, b = map(str, input().split())

from decimal import *

ans = Decimal(a)*Decimal(b)
ans = int(ans)

print(ans)

https://atcoder.jp/contests/abc169/tasks/abc169_d

"""
keyword: 素因数分解、二分探索

まずは素因数分解
素因数分解の結果、例えば素数2が5個現れる場合、異なるzで割る際は、2, 2*2, 2*2*2の3つのzで割るのが、最大で行える操作の回数
つまり、各素数について、最大で行える操作の回数mは、1からmまでの公差1の等差数列の和 m*(m+1)/2 が素数の数以下であるような最大の値
このようなmの値は、二分探索で求まる
"""
import sys
sys.setrecursionlimit(10**6)

n = int(input())

pf = {}

for i in range(2,int(n**0.5)+1):
    while n % i == 0:
        pf[i] = pf.get(i,0) + 1
        n //= i
if n > 1: pf[n] = 1

ans = 0

for v in pf.values():
    
    l = 1; r = v

    while l+1 < r:
        c = (l+r)//2
        if c*(c+1)/2 <= v:
            l = c
        else:
            r = c
    ans += l

print(ans)

これまでのA-D問題を中心としたPythonコードは以下に入れています。

github.com