hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

Atcoder ABC215 振り返り

D問題で以前作成した素因数分解関数が役立ってくれました.
hirohirohirohiros.hatenablog.com

A - Your First Judge【AC】

 言われたとおりやります.

print("AC") if input() == "Hello,World!" else print("WA")
B - log2(N)【AC】

 1WAしてしまいました……純粋にmath.log2(N)とやると,誤差が絡み正確に解けないことが多いです.小数が絡むような操作は,なるべく整数として扱えないか考える必要があります.

import math
N = int(input())
k = 1
ans = 0
while k <= N:
    k *= 2
    ans += 1
print(ans-1)
C - One More aab aba baa【AC】

 順列はitertools.permutations()で生成できます.

import itertools
S, K = input().split()
print("".join(sorted(list(set(itertools.permutations(S))))[int(K)-1]))
D - Coprime 2【AC】

 gcd(a, b) = 1というのは,aとbの最大公約数が1ということです.aとbの最大公約数が1というのは,aとbの約数で等しい数字が1しかないということです.つまり,aとbを素因数分解して,得られた基数で一致するものがなければgcd(a, b) = 1となります.素因数分解の計算量はO(√N)なので,全体の計算量はO(√NM)となり十分間に合います.

def prime_fact(x):
        略
    return prime_dict

N, M = map(int, input().split())
A = [int(i) for i in input().split()]

divisor = set()
for a in A:
    prime_dict = prime_fact(a)
    for i in prime_dict.keys():
        divisor.add(i)

ans = [1]
for i in range(2, M+1):
    prime_dict = prime_fact(i)
    div = 0
    for j in prime_dict.keys():
        if j in divisor:
            break
    else:
        ans.append(i)

print(len(ans))
for i in ans:
    print(i)