ABC解説

ユニークビジョンプログラミングコンテスト2023 春 (AtCoder Beginner Contest 300)

A. N-choice question

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    n, a, b = list(map(int, input().rstrip('\n').split()))
    c = list(map(int, input().rstrip('\n').split()))
    print(c.index(a + b) + 1)


if __name__ == '__main__':
    solve()

B. Same Map in the RPG World

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    h, w = list(map(int, input().rstrip('\n').split()))
    a = [list(str(input().rstrip('\n'))) for _ in range(h)]
    b = [list(str(input().rstrip('\n'))) for _ in range(h)]
    for i in range(h):
        for j in range(w):
            tl = []
            for k in range(h):
                tl.append([a[(i + k) % h][(j + l) % w] for l in range(w)])
            if b == tl:
                print("Yes")
                exit()
    print("No")


if __name__ == '__main__':
    solve()

C. Cross

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    h, w = list(map(int, input().rstrip('\n').split()))
    c = [list(str(input().rstrip('\n'))) for _ in range(h)]
    ls = [0] * min(h, w)
    for i in range(h):
        for j in range(w):
            if c[i][j] == "#":
                mx = -1
                for k in range(1, len(ls) + 1):
                    is_ok = True
                    for x, y in [[k, k], [k, -k], [-k, k], [-k, -k]]:
                        if 0 <= i + x < h and 0 <= j + y < w and c[i + x][j + y] == "#":
                            continue
                        else:
                            is_ok = False
                            break
                    if is_ok:
                        mx = max(mx, k)
                    else:
                        break
                if mx != -1:
                    ls[mx-1] += 1
    print(*ls)


if __name__ == '__main__':
    solve()

D. AABCC

import sys
import bisect


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    p = [True] * pow(10, 6)
    prime = []
    for i in range(2, len(p)):
        if p[i]:
            prime.append(i)
            for j in range(i, len(p), i):
                p[j] = False
    n = int(input().rstrip('\n'))
    ans = 0
    for i in range(len(prime)):
        a = pow(prime[i], 2)
        if a < n:
            for j in range(i + 1, len(prime)):
                b = prime[j]
                if a * b < n:
                    c = pow(n / a / b, 0.5)
                    if c < b:
                        break
                    else:
                        left = bisect.bisect_right(prime, b)
                        right = bisect.bisect_right(prime, c)
                        ans += right - left
                else:
                    break
        else:
            break
    print(ans)


if __name__ == '__main__':
    solve()

-ABC解説