わかさぎのブログ

プログラミング、Atcoderの勉強とか

AtCoder Beginner Contest 276 D - Divide by 2 or 3

提出コード

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

from functools import reduce
import math

def my_gcd(*numbers):
    return reduce(math.gcd, numbers)

gcd=my_gcd(*a)

a=[i/gcd for i in a]

def prime_factorize(n):
    a = []
    while n % 2 == 0:
        a.append(2)
        n //= 2
    f = 3
    while f * f <= n:
        if n % f == 0:
            a.append(f)
            n //= f
        else:
            f += 2
    if n != 1:
        a.append(n)
    return a

data=[prime_factorize(i) for i in a]
#print(data)



kara=[]
for i in data:
    kara+=i

kara_set=set(kara)
#print(kara_set)

if kara_set=={2,3} or kara_set=={2} or kara_set=={3}:
    print(len(kara))
elif len(kara_set)==0:
    print(0)
else:
    print(-1)
    

考え方

すべての数を等しくできるときその数は最大公約数になるはず。
最大公約数×2n×3mになっているはずなので、
すべての数を最大公約数で割る。
そして素因数分解して2と3のみが出てくるなら要件を満たせる。
要件を満たせるなら、素因数分解して出てきた2と3の数の合計が求める答えになる。