hirohirohirohirosのブログ

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

Atcoder ABC238 振り返り

Bがぱっと見解けなさそうだったので先にCDを取り組んだ.Cは30分で解けたがDが解けそうで解けずに結局2完となった.BCD全体的に難しい……難しくない……?

A - Exponential or Quadratic【AC】

 Pythonならそのまま書けばいい.

N = int(input())

if 2**N > N**2:
    print("Yes")
else:
    print("No")
B - Pizza【解説AC】

 どの角度に切れ込みを入れたかを記録する.過去に入れた切り込みを全て足して360で割った余りがその時入れた切り込みの角度になる.隣り合う角度の差が中心角となるのでその最大値を取る.

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

knife = [0]
sum_a = 0
for a in A:
    sum_a += a
    knife.append(sum_a % 360)

knife.append(360)
knife = sorted(knife)
ans = 0

for k in range(N+1):
    ans = max(knife[k+1]-knife[k], ans)
print(ans)
C - digitnum【AC】

 N=1桁の時,1+2+...+Nを出せばいい.1+2+...+Nは初項1,交差1,工数N,末項Nの等差数列なので,その和はn*(1+n)/2になります.
 Nが2桁以上あるときN桁-1まではf(10)+f(11)+...+f(99)のようにNがどのような値でも固定になります.これも初項と末項と項数を的確に設定して公式に当てはめて和を求める.N桁目も末項がN-100...0になることに気をつけて公式に当てはめ和を求める.

N = input()

if len(N) == 1:
    print(int(N)*(1+int(N))//2)
else:
    ans = 9*(1+9)//2
    for i in range(1, len(N)-1):
        ans += ((9*(10**i)) + 0)*(1 + (9*(10**i)) + 0)//2

    ans += (int(N) - 10**(len(N)-1) +1)*(1 + int(N) - 10**(len(N)-1) +1)//2
    print(ans % 998244353)
D - AND and SUM【解説AC】

 始めy=s-xとしてx AND s-x = aを解こうとなんとかしてたが出来なかった.
 和とAND,XORの関係の公式,x+y=(x^y)+2(x&y)を使う.これを当てはめるとs=(x^y)+2a, x^y=2a-s.x^yはマイナスはならないので,s>=2aが成り立たないといけない.
 また,(x^y)(x・y)は必ず0にならないといけない.なぜなら,x^yはどちらかが0でどちらかが1の時1となるが,x・yはどちらとも1でないと1にならない.よって(x^y)(x・y)は必ず0にならないといけない.
 この2つが成り立つ時xyが存在する.

T = int(input())

for _ in range(T):
    a, s = map(int, input().split())
    if s >= 2*a and (s-2*a)&(a) == 0:
        print("Yes")
    else:
        print("No")