結果
問題 |
No.917 Make One With GCD
|
ユーザー |
![]() |
提出日時 | 2025-03-20 18:56:52 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 156 ms / 2,000 ms |
コード長 | 1,900 bytes |
コンパイル時間 | 209 ms |
コンパイル使用メモリ | 82,572 KB |
実行使用メモリ | 77,812 KB |
最終ジャッジ日時 | 2025-03-20 18:58:15 |
合計ジャッジ時間 | 3,111 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 32 |
ソースコード
def factorize(x): factors = {} if x == 1: return factors i = 2 while i * i <= x: while x % i == 0: factors[i] = factors.get(i, 0) + 1 x = x // i i += 1 if x > 1: factors[x] = 1 return factors def generate_divisors(factors): if not factors: return [(1, 1)] primes = list(factors.keys()) exponents = [factors[p] for p in primes] divisors = [] current_exponents = [0] * len(primes) def backtrack(index): if index == len(primes): d = 1 has_square = False prime_count = 0 for i in range(len(primes)): p = primes[i] e = current_exponents[i] d *= p ** e if e >= 2: has_square = True if e >= 1: prime_count += 1 mu = 0 if has_square else (-1) ** prime_count divisors.append((d, mu)) return for e in range(0, exponents[index] + 1): current_exponents[index] = e backtrack(index + 1) backtrack(0) return divisors def main(): import sys input = sys.stdin.read().split() N = int(input[0]) A = list(map(int, input[1:N+1])) divisors_dict = {} for x in A: factors = factorize(x) generated = generate_divisors(factors) for d, mu in generated: if d not in divisors_dict: divisors_dict[d] = mu sum_ans = 0 for d in divisors_dict: mu = divisors_dict[d] if mu == 0: continue cnt = 0 for a in A: if a % d == 0: cnt += 1 if cnt == 0: continue term = mu * ((1 << cnt) - 1) sum_ans += term print(sum_ans) if __name__ == "__main__": main()