Xenous の精進記録

AtCoder関連他、学習したことの記録です。

ABC215 参加記録

  • 4完1ペナ 39分でした

A - Your First Judge

完全一致というところに気をつけて実装します。python では == で良いです。

S = input()
if S == 'Hello,World!': print('AC')
else: print('WA')

B - log2(N)

問題タイトルは計算量ですね。 10^{18} であっても、 2^{k} 側の  k 60 くらいで  10^{18} を超えます。従ってそれ以上の数でループさせて確かめれば良いです。

N = int(input())
for k in range(1000):
    if 2**k > N: break
print(k-1)

C - One More aab aba baa

 S は 8 文字なので、並び替えをしても間に合います。その後、重複を除いて  K 番目を指せば答えです。計算量は  O(S!) です。

S, K = input().split()
S = list(S)
K = int(K)
permS = list(set(permutations(S, len(S))))
permS.sort()
print(''.join(permS[K-1]))

D - Coprime 2

 i \gcd(A_i, k) = 1 を満たすには、それぞれの  A_i の素因数を  k が持っていないようにしないといけないです。 A_i素因数分解して素因数の集合として持ちます。集合の大きさは、最大でも  10^{5} 以下の素数の個数分で 10000 個ほどになります。

あとは  k を回した際、この素因数の集合で割り切れないことを確認していけば良いです。最悪計算量は  10^{9} になってしまいますが、割り切れないことを確認する際にほとんどの数は 2, 3 個の素因数の集合の要素を見るだけでスキップされるので重くなりません。

提出コード

# 素因数分解
def prime_factorize(n:int) -> list:
    """
    素因数分解を O(\sqrt{n}) で行う

        Parameters:
        -----------
        n: int
            2以上の整数
        
        Returns:
        --------
        a: list
            n の素因数のリスト
        e.g.
            input: 2940
            output: [2, 2, 3, 5, 7, 7]
    """
    assert n > 1, 'assert n > 1'
    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


def main():
    N, M = map(int, input().split())
    A = list(map(int, input().split()))
    divset = set()
    for a in A:
        if a == 1: continue
        divset.update(set(prime_factorize(a)))
    divlist = list(divset)
    divlist.sort()
    ans = []
    for k in range(1, M+1):
        flag = True
        for p in divlist:
            if k%p == 0:
                flag = False
                break
        if flag: ans.append(k)
    ans.sort()
    print(len(ans))
    print(*ans, sep='\n')


if __name__ == "__main__":
    main()

E - Chain Contestant

bitDP ぽいところまで考えましたが、応用できませんでした。

F - Dist Max 2

これも正直よく見る形かなと思います。後日復習したいと思います。