AtCoder ABC215 個人的メモ
所感
abcd4完
A - Your First Judge
S = input()
if S == "Hello,World!":
print("AC")
else:
print("WA")
B - log2(N)
公式解説のbit表現を利用した解法は賢いなぁと思った
N = int(input())
ans = 0
while pow(2, ans) <= N:
ans += 1
print(ans - 1)
N = int(input())
print(N.bit_length() - 1)
C - One More aab aba baa
これぐらいなら全列挙とソートをしても十分高速なので、全列挙してからソートして前からK番目の文字列を求めればおk。
全列挙にはitertoolsのpermutationsを使うと楽だが、
なので、set()を使って重複を除く必要がある。
from itertools import permutations
S, K = input().split()
K = int(K)
lst = set(permutations(S))
lst = sorted(lst)
ans = "".join(lst[K - 1])
print(ans)
参考
D - Coprime 2
各
各
def integer_factorization_set(n: int) -> list:
"""入力された整数nを素因数分解し,素因数が列挙された集合で返す
Args:
n (int): 素因数分解したい整数
Returns:
set: 素因数が列挙された素因数分解結果
"""
res = set()
for candidate_of_prime in range(2, int(n ** 0.5) + 1):
while n % candidate_of_prime == 0:
n //= candidate_of_prime
res.add(candidate_of_prime)
if n > 1:
res.add(n)
return res
N, M = map(int, input().split())
A = list(map(int, input().split())) # 整数を入力
seen = set()
for a in A:
seen |= integer_factorization_set(a)
ans = []
for i in range(1, M + 1):
tmp_set = integer_factorization_set(i)
if tmp_set & seen:
continue
ans.append(i)
print(len(ans))
print(*ans, sep="\n")
E - Chain Contestant
とりあえず問題を簡単にして計算量を気にせずdpを考えてみる。
コンテストが1種類のみとし、コンテストの種類ごとにひとかたまりにするという条件を無視する。
この場合は
遷移は
これはコンテストが10種類の場合でも同じdp式と遷移になる(各コンテストは何番目のコンテストなのかで区別されるから)。
コンテストの種類ごとにひとかたまりとなる条件について考える。
この場合は上記と同じdpで遷移の際に
つまり、
これで解は得られそうだがdpにもつ集合が大きくなりすぎる。
遷移の際に必要な情報は
よって、
すると、
まず、コンテストに出ない場合として
ここに各
-
でbit が立っている場合k
最後に出場したコンテストが と同じならS_i に出る場合があるのでそれを加算。S_i
dp[i][bit][k] += dp[i - 1][bit][k] -
でbit が立っていない場合k
と同じ種類のコンテストに未出場なので、S_i に出場すると新しいかたまりを作ることになる。S_i
新しいかたまりになるので直前のコンテンストは何でも良い。
にbit を立てたものをk とすると以下のようになる。bit'
dp[i][bit'][k] += \sum_{j=1}^{10} dp[i - 1][bit][j]
遷移の計算量は
N = int(input())
S = input()
MOD = 998244353
num_contest = 10
pattern_num = pow(2, num_contest)
# dp[i]はdp配列を使いわますことで省略
dp = [[0] * (num_contest) for _ in range(pattern_num)]
dp[0][0] = 1
for i in range(N):
n_dp = [list(dp[j]) for j in range(pattern_num)]
s = ord(S[i]) - ord("A")
for bit in range(pattern_num):
if bit & (1 << s):
if n_dp[bit][s]:
n_dp[bit][s] += dp[bit][s]
n_dp[bit][s] %= MOD
else:
n_dp[bit ^ (1 << s)][s] += sum(dp[bit])
n_dp[bit ^ (1 << s)][s] %= MOD
dp = n_dp
ans = sum(sum(row) % MOD for row in dp)
# 初期化したときの1を引く
ans -= 1
print(ans % MOD)
Discussion