AtCoder ABC 169

ABCD4完の緑パフォでした。今までのABC挑戦の中で、最速でDまで解けたけど(18分)、Cでつまづいてしまいました。考え方については途中気付いたけどなぜか通らずゴニョゴニョしてたら通った感じです。こういったプログラミング言語あるある(桁溢れ問題)は意識していきたい(特に小数扱う際)

A - Multiplication 1

問題のリンク

概要

  •  A×Bを求める。

制約

  •  1 ≤ A, B ≤ 100

考察

自分が見てきた中でAtCoder史上、最も簡単な問題でした。

コード

A, B = map(int, input().split())
print(int(A*B))



B - Multiplication 2

問題のリンク

概要

  •  N個の整数の積を求める。結果が 10^{18}を超える場合は、代わりに-1を出力

制約

  • [tex: 2 ≤ N ≤ 105]
  •  0 ≤ A_i ≤ 10^{18}
  • 入力は全て整数

考察

愚直に実装。0があるかどうかだけ最初に判定してないと、実際の答えは0なのに誤って-1を出力してしまうので注意

コード

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

if min(A)==0:
    print(0)
    exit()

ans = 1
for a in A:
    ans *= a
    if ans>10**18:
        print(-1)
        exit()

print(ans)



C - Multiplication 3

問題のリンク

概要

  •  A×Bを求める。 Bは小数第2位まで与えられる。

制約

  • Aは整数
  • Bは小数第2位まで与えられる
  •  0 ≤ A ≤ 10^{15}
  •  0 ≤ B ≤ 10

考察

 A問題の小数問題ということで、桁溢れエラーを誘ってる感がぷんぷん漂ってはきていたのですが、結局実装でミスりまくりました。(計7回)  とりあえずなるべく小数問題を避けたいので、文字列やら整数やらで代用できる様にゴニョゴニョしてたらいつの間にか解けたって感じですが、次からはこういうの気をつけたい。

コード

from math import floor

A, B = input().split()
A = int(A)

B1 = int(B[:-3])
B2 = int(str(B)[-2:])

ans1 = A * B1
ans2 = A * B2 // 100

ans = ans1 + ans2
print(floor(ans))



D - Div Game

問題のリンク

概要

  • はじめに整数 Nが与えられる。 Nに対して、以下の操作を何度できるか。
- ある素数[tex: p]と正の整数[tex: e]を用いて、[tex: z = p^e]と表せる。
- [tex: N]が[tex: z]で割り切れる。
- 以前の操作で選んだどの整数とも異なる。
- [tex: N]を[tex: N/z]に置き換える。

制約

  • 入力は全て整数
  •  1 ≤ N ≤ 10^{12}

考察

  • まず、 N素因数分解
  • 次にそれぞれの素因数から問題文の条件を満たす zがどれだけ作れるかをループでカウント

コード

N = int(input())

def factorization(n):
    arr, temp = [], n
    for i in range(2, int(-(-n**0.5//1))+1):
        if temp%i==0:
            cnt=0
            while temp%i==0:
                cnt+=1
                temp //= i
            arr.append([i, cnt])
    if temp!=1:
        arr.append([temp, 1])
    if arr==[]:
        arr.append([n, 1])
    return arr

fac = factorization(N)
ans = 0

for k, v in fac:
    cnt = 1
    if k != 1:
        while True:
            v -= cnt
            if v < 0:
                break
            ans += 1
            cnt += 1

print(ans)