LoginSignup
1
1

More than 3 years have passed since last update.

AtCoder エイシング プログラミング コンテスト 2020 参戦記

Last updated at Posted at 2020-07-11

AtCoder エイシング プログラミング コンテスト 2020 参戦記

むちゃくちゃ眠かったので、直前に20分仮眠して頑張った.

aising2020A - Number of Multiples

1分半で突破. 問題の条件の通り書くだけ. 時間がかかるので、O(1) で解こうとかそういう事は考えない.

L, R, d = map(int, input().split())

result = 0
for i in range(L, R + 1):
    if i % d == 0:
        result += 1
print(result)

追記: O(1)

L, R, d = map(int, input().split())

print(R // d - (L - 1) // d)

aising2020B - An Odd Problem

2分で突破. 問題の条件の通り書くだけ.

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

result = 0
for i in range(N):
    if (i + 1) % 2 == 1 and a[i] % 2 == 1:
        result += 1
print(result)

追記: 偶数番目なんてスライスで飛ばせばよかったんや…….

N, *a = map(int, open(0).read().split())

print(sum(1 for e in a[::2] if e % 2 == 1))

aising2020C - XYZ Triplets

6分半で突破. N≤104 だから3重ループでも通ると思った. 実際、通った.

N = int(input())

result = [0] * (N + 1)
for x in range(1, 101):
    for y in range(1, 101):
        for z in range(1, 101):
            n = x * x + y * y + z * z + x * y + y * z + z * x
            if n > N:
                break
            result[n] += 1

print(*result[1:], sep='\n')

aising2020D - Anything Goes to Zero

突破できず. A = B * C のとき A % m = (B % m) * (C % m) % m を使って大きな数の余りは出せるなあと思って、それを使って組んだけど、TLE は出るし、RE も出るしでよく分からないことに. 最初の1回目の処理は事前計算で O(1) に出来るけど、2回目以降はどうするんだろ.

追記: f(n) の返す値の最大値は log2(n) なので 22×105 → 2×105 → 17.6 → 4.1 → 2.0 → 1 → 0 とあっという間に収束する. なので最初の1回だけなんとかすればよかった. TLE を見て f(n) の高速化に走ったのは間抜けだった.

RE が出ていたのはもともとビットが1つしか立ってなかったとき、その唯一立っているビットが反転されると popcount が0になることに気づかず0の除算で出ていた. TLE が出ていたのは log2(X) すら 2×105 なことを意識せずに O(NlogX) で書いていたため.

着想は合っていたものの、ところどころ抜けがあって解けなかった感じ. 残念.

def popcount(n):
    return bin(n).count("1")


def f(n):
    if n == 0:
        return 0
    return 1 + f(n % popcount(n))


N = int(input())
X = input()

c = X.count('1')
t1 = [0] * N
t1[0] = 1 % (c + 1)
for i in range(1, N):
    t1[i] = (t1[i - 1] << 1) % (c + 1)
x1 = 0
for i in range(N):
    if X[i] == '0':
        continue
    x1 += t1[N - 1 - i]

if c - 1 != 0:
    t2 = [0] * N
    t2[0] = 1 % (c - 1)
    for i in range(1, N):
        t2[i] = (t2[i - 1] << 1) % (c - 1)
    x2 = 0
    for i in range(N):
        if X[i] == '0':
            continue
        x2 += t2[N - 1 - i]

result = []
for i in range(N):
    if X[i] == '0':
        n = (x1 + t1[N - 1 - i]) % (c + 1)
    elif X[i] == '1':
        if c - 1 == 0:
            result.append(0)
            continue
        n = (x2 - t2[N - 1 - i]) % (c - 1)
    result.append(1 + f(n))
print(*result, sep='\n')
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1