AtCoder ABC 169
ABCD4完の緑パフォでした。今までのABC挑戦の中で、最速でDまで解けたけど(18分)、Cでつまづいてしまいました。考え方については途中気付いたけどなぜか通らずゴニョゴニョしてたら通った感じです。こういったプログラミング言語あるある(桁溢れ問題)は意識していきたい(特に小数扱う際)
A - Multiplication 1
概要
- を求める。
制約
考察
自分が見てきた中でAtCoder史上、最も簡単な問題でした。
コード
A, B = map(int, input().split()) print(int(A*B))
B - Multiplication 2
概要
- 個の整数の積を求める。結果がを超える場合は、代わりに
-1
を出力
制約
- [tex: 2 ≤ N ≤ 105]
- 入力は全て整数
考察
愚直に実装。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
概要
- を求める。は小数第2位まで与えられる。
制約
- Aは整数
- Bは小数第2位まで与えられる
考察
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
概要
- はじめに整数が与えられる。に対して、以下の操作を何度できるか。
- ある素数[tex: p]と正の整数[tex: e]を用いて、[tex: z = p^e]と表せる。 - [tex: N]が[tex: z]で割り切れる。 - 以前の操作で選んだどの整数とも異なる。 - [tex: N]を[tex: 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)