1
1

More than 1 year has passed since last update.

ABC236~250『 AtCoder ABC226~250 ARC129~139 灰・茶・緑問題 超詳細解説』コピペ用コード

Last updated at Posted at 2022-04-28

ABC226~235 https://qiita.com/sano192/items/6d7cd42eed478a6a7a29
ARC129~139 https://qiita.com/sano192/items/485d38fa76246e866bd1

この記事は 『AtCoder ABC226~250 ARC129~139 灰・茶・緑問題 超詳細解説』 の提出コード一覧です。

値段:300円(Kindle Unlimited対象)
【kindle】
https://www.amazon.co.jp/dp/B0B7G13QMS

【booth(pdf)】
https://sano192.booth.pm/items/4025713

ARC129~139の部分のみ抜粋した廉価版 もあります。
値段:200円(Kindle Unlimited対象)
【kindle】
https://www.amazon.co.jp/dp/B0B7G337YF

【booth(pdf)】
https://sano192.booth.pm/items/4025737

ABC236 A

# 入力の受け取り
S=input()
a,b=map(int,input().split())
 
# a,b文字目を入れ替え
# ⇔「Sの1~(a-1)文字目」+「Sのb文字目」+「Sの(a+1)~(b-1)文字目」+「Sのb文字目」+「Sの(b+1)~末尾文字目」
ans=S[:a-1]+S[b-1]+S[a:b-1]+S[a-1]+S[b:]
 
# 答えの出力
print(ans)

ABC236 B

# 入力の受け取り
N=int(input())
A=list(map(int,input().split()))
 
# 枚数を数えるリスト
Count=[0]*(N+1)
 
# i=0~(4N-2)
for i in range(4*N-1):
    # A[i]をプラス一枚カウント
    Count[A[i]]+=1
 
# i=1~N
for i in range(1,N+1):
    # 枚数が3ならば
    if Count[i]==3:
        # iが抜かれたカード
        print(i)
        # 途中終了
        exit()

ABC236 C

# 入力の受け取り
N,M=map(int,input().split())
S=list(map(str,input().split()))
T=list(map(str,input().split()))
 
# defaultdictをインポート
from collections import defaultdict
 
# 急行が止まる駅
# 「1」なら止まる
# 「0」(デフォルト値)なら止まらない
Stations=defaultdict(int)
 
# i=0~(M-1)
for i in range(M):
    # 「1」を記録
    Stations[T[i]]=1
 
# i=0~(N-1)
for i in range(N):
    # S[i]が止まる駅
    if Stations[S[i]]==1:
        # 「Yes」を出力
        print("Yes")
    # 止まらない駅
    else:
        # 「No」を出力
        print("No")
# 入力の受け取り
N,M=map(int,input().split())
S=list(map(str,input().split()))
T=set(map(str,input().split()))
 
# x:Sの要素それぞれについて
for x in S:
    # Tに含まれるなら「Yes」、含まれないなら「No」
    if x in T:print("Yes")
    else:print("No")

ABC236 D

# pypyで提出
 
# 再起回数上限を10^6へ変更
import sys
sys.setrecursionlimit(10**6)
 
# 入力の受け取り
N=int(input())
 
# 「相性」の表
A=[[0]*(2*N+1) for i in range(2*N+1)]
 
# i=1~(2N-1)
for i in range(1,2*N):
    # 入力を受け取る
    Atmp=list(map(int,input().split()))
    # 表に記載
    for j in range(len(Atmp)):
        A[i][j+(i+1)]=Atmp[j]
        A[j+(i+1)][i]=Atmp[j]
 
# 答え
ans=0
 
# 引数:Pairs(ペアの一覧)
def DFS(Pairs):
    # ansを更新できるように
    global ans
 
    # 全員ペアができていれば
    # ⇔Pairsの長さが2Nならば
    if len(Pairs)==2*N:
        # 「楽しさ」の計算
        Score=0
        # i=0~(2N-1)まで 2ずつ増加
        for i in range(0,2*N,2):
            # ペアになる人
            x=Pairs[i]
            y=Pairs[i+1]
            # 「相性」から「楽しさ」を計算
            Score^=A[x][y]
       
        # 「楽しさ」が大きかったら答えを更新
        ans=max(ans,Score)
 
    # 次に追加する人が偶数番目
    # ⇔Pairsの長さが偶数
    elif len(Pairs)%2==0:
        # 選ばれていない中で一番小さい番号の人を選ぶ
        i=1
        while i in Pairs:
            i+=1
        # Pairsへ追加
        Pairs.append(i)
        # 次のDFSへ
        DFS(Pairs)
        # 前のDFSが終わったらPairsから消す
        Pairs.pop()
 
    # 次に追加する人が奇数番目
    # ⇔Pairsの長さが奇数
    else:
        # 選ばれていない人を一人ずつ全て選ぶ
        for i in range(1,2*N+1):
            # まだ選ばれていないなら
            if i not in Pairs:
                # 追加
                Pairs.append(i)
                # 次のDFSへ
                DFS(Pairs)
                # 前のDFSが終わったらPairsから消す
                Pairs.pop()
 
 
# ペアになる人を記録するリスト(最初は空)
# 最終的にPairsの(0番目と1番目),(2番目と3番目),...,((2N-2)番目と(2N-1))をペアとする
Pairs=[]
 
# DFSを開始
DFS(Pairs)
 
# 答えの出力
print(ans)

ABC237 A

#入力の受け取り
N=int(input())
 
# -2^31以上2^31未満ならば
if(-2)**31<=N<2**31:
    # 「Yes」 を出力
    print("Yes")
#そうでないならば
else:
    # 「No を出力」
    print("No")

ABC237 B

# 入力の受け取り
H,W=map(int,input().split())
 
#空のリストを作る
A=[]
 
# H回
for i in range (H):
    # 一行ずつリストとして受け取り
    # tmp=tmporary(一時的な)の意味
    Atmp=list(map(int,input().split()))
    # Aへ追加
    A.append(Atmp)
 
# W*Hの二次元配列を作成
B=[[0]*H for i in range(W)]
 
# i=0~(W-1)
for i in range (W):
    #j=0*(H-1)
    for j in range (H):
        #Bの値を更新
        B[i][j]=A[j][i]
 
# i=0~(W-1)
for i in range (W):
    # 一行ずつ出力
    print(*B[i])

ABC237 C

# 入力の受け取り
S=input()
 
# 先頭にある「a」の数
aFront=0
 
# i=0~(Sの文字数-1)
for i in range(len(S)):
# i文字目が「a」なら
    if S[i]=="a":
        #カウント
        aFront+=1
    # そうでないなら
    else:
        # for を抜ける
        break
 
# 末尾にある「a」の数
aBack=0
 
# i=(Sの文字数-1)~0 -1ずつ
for i in range(len(S)-1,-1,-1):
# i文字目が「a」なら
    if S[i]=="a":
        #カウント
        aBack+=1
    # そうでないなら
    else:
        # for を抜ける
        break
 
# 「末尾の「a」の個数」<「先頭の「a」の個数」
if aBack<aFront:
    # 「No」を出力
    print("No")
    # 終了
    exit()
 
# (「末尾の「a」の個数」-「先頭の「a」の個数」)分先頭に「a」を追加
S="a"*(aBack-aFront)+S
 
# Sの文字数
N=len(S)
 
# i=0~(N-1)
for i in range(N):
    # 回文か判定
    # 1文字目と(N-i-1)文字目が違うなら
    if S[i]!=S[N-i-1]:    
        # 「No」を出力
        print("No")
        # 終了
        exit()
 
# ここまで来たら回文
# 「Yes」を出力
print("Yes")

ABC237 D

# 入力の受け取り
N=int(input())
S=input()
 
# deque のインポート
from collections import deque
 
# キューを用意
que=deque()
 
# Nを追加
que.append(N)
 
# i=(N-1)~0 -1ずつ
for i in range(N-1,-1,-1):
    # Sのi文字目が「R」
    if S[i]=="R":
        # 先頭(左端)へ「i」を追加
        que.appendleft(i)
    # そうでない場合(Sのi文字目が「L」)
    else:
        # 末端(右端)へ「i」を追加
        que.append(i)  
 
# 答えの出力
# ([]がいらない場合は先頭に「*」をつける)
print(*que)

ABC238 A

# 入力の受け取り
n=int(input())
 
# 2≤n≤4の場合
if 2<=n<=4:
    # 「No」を出力
    print("No")
# それ以外の場合
else:
    # 「Yes」を出力
    print("Yes")

ABC238 B

# 入力の受け取り
N=int(input())
A=list(map(int,input().split()))
 
# カットされた角度の格納
Angle=[]
 
# 現在の角度
Now=0
 
# i=0~(N-1)
for i in range(N):
    # 現在の角度へA[i]をプラス
    Now+=A[i]
    # 角度を記録
    Angle.append(Now)
 
# i=0~(N-1)
for i in range(N):
    # 360で割った余りを取る
    Angle[i]%=360
 
# 小さい順に並び替え
Angle.sort()
 
# 「360」を追加
Angle=[0]+Angle+[360]
 
# 答え
ans=0
 
# i=1~(N+1)
for i in range(1,N+2):
    # 現在までの「答え」と(Angle[i]-Angle[i-1])の差を比較
    # 大きい方を新しい答えとする
    ans=max(ans,Angle[i]-Angle[i-1])
 
# 答えを出力
print(ans)

ABC238 C

# 余りを定義
mod=998244353
 
# 入力の受け取り
N=int(input())
 
# A~Bまでの和
# 引数:A,B → 返り値:A~Bまでの和
def S(A,B):
    return (B-A+1)*(A+B)//2
 
# 答え
ans=0
 
# x~1~18
for x in range(1,19):
    # 10^x≤Nならば
    if 10**x<=N:
        # 「1~9*10**(x-1)までの和」
        ans+=S(1,9*10**(x-1))
        # 余りを取る
        ans%=mod
    # 10^(x-1)≤N<10^xならば
    else:
        # 「1~(N-10^(x-1)+1)までの和」
        ans+=S(1,N-10**(x-1)+1)
        # 余りを取る
        ans%=mod
        # forを抜ける
        break
 
# 答えの出力
print(ans)

ABC238 D

# 入力の受け取り
N=int(input())
 
# 各テストケース
for T in range(N):
    # 入力の受け取り
    a,s=map(int,input().split())
    # 繰り上がりの初期化
    up=0
 
    # 答え
    ans="Yes"
    # N:桁数 s,aのうち桁数の大きい方
    N=max(a.bit_length(),s.bit_length())
 
    # i桁目
    for i in range(N):
        # 「aのi桁目」
        ai=a>>i & 1
        # 「sのi桁目」
        si=s>>i & 1
 
        # 条件から答えと繰り上がりを計算
        if ai==0:
            if up==1 and si==0:
                up=1
            else:
                up=0
        else:
            if up+si==1:
                ans="No"
                break
            up=1    
       
        # 最後の桁で繰り上がりがあれば
        if i==N-1 and up==1:
            ans="No"
   
    print(ans)

ABC239 A

# 入力の受け取り
H=int(input())
 
# ルートの計算のためsqrtをインポート
import math
 
# 答えの出力
print(math.sqrt(H*(12800000+H)))

ABC239 B

# 入力の受け取り
X=int(input())
 
# Xを10で割った商を出力
print(X//10)

ABC239 C

# 入力の受け取り
x1,y1,x2,y2=map(int,input().split())
 
# (x1,y1)との距離が√5の格子点:(x3,y3)=(x1+2,y1+1)
x3=x1+2
y3=y1+1
 
# ((x2,y2)と(x3,y3)の距離)^2=5ならば
if (x3-x2)**2+(y3-y2)**2==5:
        # 「Yes」を出力
        print("Yes")
        # 終了
        exit()
 
x3=x1+2
y3=y1-1
if (x3-x2)**2+(y3-y2)**2==5:
        print("Yes")
        exit()
 
x3=x1-2
y3=y1+1
if (x3-x2)**2+(y3-y2)**2==5:
        print("Yes")
        exit()
 
x3=x1-2
y3=y1-1
if (x3-x2)**2+(y3-y2)**2==5:
        print("Yes")
        exit()
 
x3=x1+1
y3=y1+2
if (x3-x2)**2+(y3-y2)**2==5:
        print("Yes")
        exit()
 
x3=x1+1
y3=y1-2
if (x3-x2)**2+(y3-y2)**2==5:
        print("Yes")
        exit()
 
x3=x1-1
y3=y1+2
if (x3-x2)**2+(y3-y2)**2==5:
        print("Yes")
        exit()
 
x3=x1-1
y3=y1-2
if (x3-x2)**2+(y3-y2)**2==5:
        print("Yes")
        exit()
 
# 「No」を出力
print("No")
x1,y1,x2,y2=map(int,input().split())
 
# 距離が√5になっているか判定
def Judge(x3,y3):
    if (x2-x3)**2+(y2-y3)**2==5:
        print("Yes")
        exit()
 
# i:-1,1
for i in [-1,1]:
    # k:-2,2
    for k in [-2,2]:
        Judge(x1+i,y1+k)
        Judge(x1+k,y1+i)        
 
print("No")

ABC239 D

# 入力の受け取り
A,B,C,D=map(int,input().split())
 
# 1~200までの素数
P=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199]
 
# 高橋の選ぶ数:taka=A~B
for TakaNum in range(A,B+1):
    # 高橋が勝っている間はTrue
    TakaWin=True
 
    # 青木くんの選ぶ数:ao=C~D
    for AokiNum in range(C,D+1):
        # 和が素数なら(素数リストの中にあるなら)
        if TakaNum+AokiNum in P:
            # 高橋君の負け
            TakaWin=False
            # 次の数へ
            break
       
    # 青木くんの選んだ数全てについて高橋くんが勝ちなら
    if TakaWin==True:
        # 「takahashi」を出力
        print("Takahashi")
        # 終了
        exit()
 
# 「Aoki」を出力
print("Aoki")
A,B,C,D=map(int,input().split())
 
# エラトステネスの篩
def Eratosthenes(N):
    # 素数であるかの判定リスト
    IsPrime=[True]*(N+1)
 
    # i=2,3,4,...
    i=2
    # i≤√Nまで⇔i^2≤Nまで
    while i**2<=N:
        # iが素数でなければ
        if IsPrime[i]==False:
            # 次のiへ
            i+=1
            continue
       
        # k=2,3,4,...
        k=2
        while i*k<=N:
            # iの倍数は素数でない
            IsPrime[i*k]=False
            # 次のkへ
            k+=1
 
        # 次のkへ
        i+=1
 
    # 素数リスト
    PList=[]
 
    # i=2~N
    for i in range(2,N+1):
        # iが素数ならば
        if IsPrime[i]==True:
            # リストへ入れる
            PList.append(i)
 
    # リストを返す
    return PList
 
P=Eratosthenes(200)
 
for TakaNum in range(A,B+1):
    TakaWin=True
 
    for AokiNum in range(C,D+1):
        if TakaNum+AokiNum in P:
            TakaWin=False
            break
       
    if TakaWin:
        print("Takahashi")
        exit()
 
print("Aoki")

ABC239 E

# 入力の受け取り
N,Q=map(int,input().split())
# 1インデックスにするため先頭に「0」を追加
X=[0]+list(map(int,input().split()))
# 辺の情報格納用
edge=[[] for i in range(N+1)]
 
# (N-1)回
for i in range(N-1):
    # 入力の受け取り
    A,B=map(int,input().split())
    # 辺の情報を格納
    edge[A].append(B)
    edge[B].append(A)
 
# 部分木の頂点に書いている数を大きい順に格納したリスト
# 1インデックスにするため0番目は埋めておく
P=[[0]]
 
# (1)「部分木に含まれる数を大きい順にソートした二次元配列」をPとし、自分自身に書いている数をPへ記録する
for i in range(1,N+1):
    # Pへ自分自身に書いている数を追加
    P.append([X[i]])
 
# (2)キューを用意する
que=list()
 
# (3)スタート地点=頂点①をキューへ入れる
# (今いる頂点,今いる頂点の親,訪問回数)
que.append((1,0,1))
 
# (4)キューが空になるまで(3)を繰り返す
while 0<len(que):
    # (4)キューの「右端から」要素を取り出す
    # (今いる頂点,今いる頂点の親,訪問回数)
    now,parent,count=que.pop()
 
    # ・1回目の訪問ならば
    if count==1:
        # (4-1)「今いる頂点」を2回目の訪問としてキューへ記録
        que.append((now,parent,2))
        # (4-2)「今いる頂点から行ける(親でない)頂点」をキューへ1回目の訪問として記録
        # to:今いる頂点から行ける頂点
        for to in edge[now]:
            # 親でなければ
            if to!=parent:
                # キューへ記録
                que.append((to,now,1))
 
    # ・2回目の訪問ならば
    else:
        # to:今いる頂点から行ける頂点
        for to in edge[now]:
            # (4-3)「今いる頂点」のPへ子の頂点のPを追加
            # 親ならば
            if to==parent:
                # 次の頂点へ
                continue
            P[now]+=P[to]
            # (4-4)大きい順にソート
            P[now].sort(reverse=True)
            # (4-5)20番目以降の要素を捨てる
            P[now]=P[now][:20]
 
# Q回
for i in range(Q):
    # 入力の受け取り
    V,K=map(int,input().split())
    # Kをマイナス1(P[v]は先頭が0番目、次が1番目、...のため)
    K-=1
    # 答えを出力
    print(P[V][K])

ABC240 A

# 入力の受け取り
a,b=map(int,input().split())
 
# a=1ならば
if a==1:
    # b=2または10ならば
    if b==2 or b==10:
        # 「Yes」を出力
        print("Yes")
    # そうでないなら
    else:
        # 「No」を出力
        print("No")
# それ以外(aが1でない)
else:
    # b=(a+1)ならば
    if b==a+1:
        # 「Yes」を出力
        print("Yes")
    # そうでないなら
    else:
        # 「No」を出力
        print("No")

ABC240 B

# 入力の受け取り
N=int(input())
a=list(map(int,input().split()))
 
# リスト→セットへ変換
aSet=set(a)
 
# 長さを出力
print(len(aSet))

ABC240 C

# 入力の受け取り
N,X=map(int,input().split())
 
# i回目のジャンプで到達できる座標
P=set()
 
# 最初は座標0にいる
P.add(0)
 
# N回
for i in range(1,N+1):
    # 入力の受け取り
    a,b=map(int,input().split())
 
    # i回目のジャンプで到達できる座標セット
    NewP=set()
 
    # Now=(i-1)回目のジャンプで到達できる座標
    for Now in P:
        # +aした座標がX以下なら
        if Now+a<=X:
            # 新しい到達できる座標セットに記録
            NewP.add(Now+a)
        # +bした座標がX以下なら
        if Now+b<=X:
            # 新しい到達できる座標セットに記録
            NewP.add(Now+b)
 
    # 到達できる座標セットを更新
    P=NewP
 
# XがPにあれば
if X in P:
    # 「Yes」を出力
    print("Yes")
# そうでなければ(XがPになければ)
else:
    # 「No」出力
    print("No")

ABC240 D

# 入力の受け取り
N=int(input())
a=list(map(int,input().split()))
 
# 筒
que=[]
 
# 同じ数字のボールがいくつ下に続いているか
Count=[]
# 今筒の中にあるボールの数
ans=0
 
# i=0~(N-1)
for i in range(N):
    # 筒にボールを落とす
    que.append(a[i])
    # 筒の中のボールが1個増える
    ans+=1
 
    # 筒に2つ以上ボールがある かつ 1番上のボールと2番目のボールの数字が同じ
    if 2<=len(que) and que[-1]==que[-2]:
        # 同じ数字のボールが続いている個数を+1
        Count.append(Count[-1]+1)
        # (1番上のボールの数字)個続いたら
        if Count[-1]==que[-1]:
            # (1番上のボールの数字)個消える(=取り出す)
            # ⇔(1番上のボールの数字)回取り出し
            for j in range(que[-1]):
                # 筒から取り出す
                que.pop()
                # countも消す
                Count.pop()
                # ボールが1個減った
                ans-=1
               
    # そうでないなら
    else:
        # 2番目と1番目のボールは別の数字だから「1」を記録
        Count.append(1)
   
    # 答えを出力
    print(ans)

ABC240 E

# 入力の受け取り
N=int(input())
 
# 辺の情報
edge=[[] for i in range(N+1)]
for i in range(N-1):
    # 入力の受け取り
    u,v=map(int,input().split())
    edge[u].append(v)
    edge[v].append(u)
    # ①→②,③,④がつながっているなら
    # edge[1]=[2,3,4]
 
# 区間
LR=[[10**9,-1] for i in range(N+1)]
 
# (1)キューを用意する
# 「今いる頂点、今いる頂点の親、訪問回数」を記録
# (2)スタート地点=頂点①をキューへ入れる
# (①の親はいないから0にしておく。訪問回数は1回目)
que=[(1,0,1)]
 
# 「葉」に割当する区間の左右番号
LeafCount=1
 
# (4)キューが空になるまで(3)を繰り返し
while 0<len(que):
    # (3)キューの「右端から」要素を取り出す
    # 今いる頂点、今いる頂点の親、訪問回数
    Now,Parent,Visit=que.pop()
 
    # ・1回目の訪問ならば
    if Visit==1:
        # (3-1)「今いる頂点」を2回目の訪問としてキューへ記録
        que.append((Now,Parent,2))
        # To:「今いる頂点」から行ける頂点
        for To in edge[Now]:
            # 親でなければ
            if To!=Parent:
                # (3-2)「今いる頂点から行ける頂点」のうち、「親」でないものをキューへ1回目の訪問
                que.append((To,Now,1))
   
    # ・2回目の訪問ならば
    else:
        # ・「葉」であれば(頂点①でない かつ 出ている辺の本数が1本)
        if Now!=1 and len(edge[Now])==1:
            # (3-3)区間の割当([1,1],[2,2],...)
            LR[Now]=[LeafCount,LeafCount]
            # カウントを増やす
            LeafCount+=1
        # (3-4)「子」の情報から「親」の区間更新
        # 「親」Li=(現在のLi)と(子のLi)の小さい方
        LR[Parent][0]=min(LR[Parent][0],LR[Now][0])
        # 「親」Ri=(現在のRi)と(子のRi)の大きい方
        LR[Parent][1]=max(LR[Parent][1],LR[Now][1])
 
# i=1~N
for i in range(1,N+1):
    # 答えを出力
    print(*LR[i])

ABC241 A

# 入力の受け取り
a=list(map(int,input().split()))
 
# 最初に画面に表示されているのは「0」
k=0
 
# ボタンを押す
k=a[k]
 
# ボタンを押す
k=a[k]
 
# ボタンを押す
k=a[k]
 
# 答えを出力
print(k)

ABC241 B

# 入力の受け取り
N,M=map(int,input().split())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
 
# i=0~(M-1)
for i in range(M):
    # B[i]がAに含まれるなら
    if B[i] in A:
        # Aに含まれるB[i]のうち先頭のものを削除
        A.remove(B[i])
    # そうでないならば(B[i]がAに含まれない)
    else:
        # 「No」を出力
        print("No")
        # 途中終了
        exit()
 
# 「Yes」を出力
print("Yes")

ABC241 C

# pypyで提出
 
# 入力の受け取り
N=int(input())
 
# マス目の情報格納用
Grid=[]
 
# N回
for i in range(N):
    # 文字列で受け取り
    S=input()
    # リストへ展開
    S=list(S)
    # Gridへ追加
    Grid.append(S)
 
# 右方向へ「#」を数える
# 引数:行番号,列番号 → 返り値「#」の数
def SearchRight(G,R):
    # 「#」の数
    count=0
    # i=0~5まで
    for i in range(6):
        # マス(行番号,列番号)=「#」ならば
        if Grid[G][R+i]=="#":
            # カウント
            count+=1
    # 数を返す
    return count
 
# 下方向
def SearchDown(G,R):
    count=0
    for i in range(6):
        if Grid[G+i][R]=="#":
            count+=1
    return count
 
# 右下方向
def SearchRightDown(G,R):
    count=0
    for i in range(6):
        if Grid[G+i][R+i]=="#":
            count+=1
    return count
 
# 左下方向
def SearchLeftDown(G,R):
    count=0
    for i in range(6):
        if Grid[G+i][R-i]=="#":
            count+=1
    return count
 
# G=0~(N-1)
for G in range(N):
    # R=0~(N-1)
    for R in range(N):
        # 5マス右がマス目の中に収まっているならば
        if R+5<N:
            # 「#」の数が4つ以上なら
            if 4<=SearchRight(G, R):
                # 「Yes」を出力
                print("Yes")
                # 終了
                exit()
 
        # 5マス下がマス目の中に収まっているならば
        if G+5<N:
            if 4<=SearchDown(G, R):
                print("Yes")
                exit()
 
        # 5マス右下がマス目の中に収まっているならば
        if R+5<N and G+5<N:
            if 4<=SearchRightDown(G, R):
                print("Yes")
                exit()
 
        # 5マス左下がマス目の中に収まっているならば
        if G+5<N and 0<=R-5:
            if 4<=SearchLeftDown(G, R):
                print("Yes")
                exit()
 
# 「No」を出力
print("No")
# pypyで提出
 
N=int(input())
 
Grid=[]
 
for i in range(N):
    S=input()
    Grid.append(S)
 
# 「#」を数える
# 引数:行番号,列番号,行方向(0 or 1),列方向(-1 or 0 or 1)
def CountSharp(G,R,Gd,Rd):
    # 「#」の数
    count=0
    # i=0~5まで
    for i in range(6):
        # マス(行番号+Gd*i,列番号+Rd*i)=「#」ならば
        if Grid[G+Gd*i][R+Rd*i]=="#":
            # カウント
            count+=1
   
    # 「#」が4個以上なら
    if 4<=count:
        print("Yes")
        exit()
   
# G=0~(N-1)
for G in range(N):
    # R=0~(N-1)
    for R in range(N):
        # 右方向
        if R+5<N:CountSharp(G, R, 0, 1)
        # 下方向
        if G+5<N:CountSharp(G, R, 1, 0)
        # 右下方向
        if G+5<N and R+5<N:CountSharp(G, R, 1, 1)
        # 左下方向
        if G+5<N and 0<=R-5:CountSharp(G, R, 1, -1)
 
# 「No」を出力
print("No")

ABC241 D

# pypyで出力
 
class FenwickTree:
    def __init__(self,n):
        self._n=n
        self.data=[0]*n
    def add(self,p,x):
        p+=1
        while p<=self._n:
            self.data[p-1] +=x
            p+=p&-p
    def _sum(self,r):
        s=0
        while 0<r:
            s+=self.data[r-1]
            r-=r&-r
        return s
    def sum(self,l,r):
        r+=1
        return self._sum(r)-self._sum(l)
    def select(self,p):
        return self.sum(p,p)
 
# 入力の受け取り
Q=int(input())
 
# クエリの情報格納用
querys=[]
 
# Aを用意(重複除去のためセット)
A=set()
 
# Q回
for i in range(Q):
    # クエリを読み込み
    tmp=list(map(int,input().split()))
    # 記録
    querys.append(tmp)
    # xをAへ追加
    x=tmp[1]
    A.add(x)
 
# Aの長さをNとする
N=len(A)
 
# リストへ変換してソート
A=list(A)
A.sort()
 
# 変換用連想配列
Conv=dict()
 
# i=0~(Aの長さ-1)
for i in range(len(A)):
    # 変換表を作成
    # 「x」→「Aの小さい方から○番目」
    Conv[A[i]]=i
 
# 左方向への区間和計算
# 引数:変換後のxのインデックス,k → 返り値:k≤区間和[m,x(のインデックス)]となるうち、最大のm
def NibutanLeft(xIndex,k):
    # 左端(left)
    l=0
    # 右端(right)
    r=xIndex
 
    # 1<右-左の間
    while 1<r-l:
        # 中央(center)
        c=(l+r)//2
        # 区間和[c,xIndex]を計算
        # k以上なら
        if k<=FT.sum(c,xIndex):
            # 左=中央と更新
            l=c
        # k以下なら
        else:
            # 右=中央と更新
            r=c
 
    # k≤区間和[r,xIndex]ならば
    if k<=FT.sum(r,xIndex):
        # rが一番近い
        return r
    # k≤区間和[l,xIndex]ならば
    elif k<=FT.sum(l,xIndex):
        # lが一番近い
        return l
    # どちらでもない
    else:
        # k≤区間和[m,x(のインデックス)]となるmが存在しない
        return -1
 
# 右方向への区間和計算
def NibutanRight(xIndex,k):
    l=xIndex
    r=N-1
    while 1<r-l:
        c=(l+r)//2
        if k<=FT.sum(xIndex,c):
            r=c
        else:
            l=c
 
    if k<=FT.sum(xIndex,l):
        return l
    elif k<=FT.sum(xIndex,r):
        return r
    else:
        return -1
 
# FenwickTreeを用意
FT=FenwickTree(N)
 
# Q回
for i in range(Q):
    # クエリ①
    if querys[i][0]==1:
        x=querys[i][1]
        # FTに加算
        FT.add(Conv[x],1)
 
    # クエリ②
    elif querys[i][0]==2:
        x=querys[i][1]
        k=querys[i][2]
 
        if FT.sum(0, Conv[x])<k:
            print(-1)
        else:
            # FTについてk≤区間和[m,x(のインデックス)]となるうち、最大のm
            m=NibutanLeft(Conv[x],k)
            # 答えを出力
            print(A[m])
 
    # クエリ③
    else:
        x=querys[i][1]
        k=querys[i][2]
 
        if FT.sum(Conv[x], N-1)<k:
            print(-1)
        else:
            m=NibutanRight(Conv[x],k)
            # 答えを出力
            print(A[m])

ABC242 A

# 入力の受け取り
A,B,C,X=map(int,input().split())
 
# X≤Aの場合
if X<=A:
    # 確率は1
    print(1)
 
# A<X≤Bの場合
elif A<X<=B:
    # 確率はC/(B-A)
    print(C/(B-A))
 
# それ以外(B<X)の場合
else:
    # 確率は0
    print(0)

ABC242 B

# 入力の受け取り
S=input()
 
# (1)Sを1文字ずつリストに格納する
S=list(S)
 
# (2)Sをソートする
S.sort()
 
# (3)リストを結合する
S="".join(S)
 
# 答えの出力
print(S)

ABC242 C

# pypyで提出
 
# 余りの定義
mod=998244353
 
# 入力の受け取り
N=int(input())
 
# (1)表を作る
dp=[[0]*10 for i in range(N+1)]
 
# (2)すぐにわかるところを埋める
# i=1~9
for i in range(1,10):
    # ・(1≤i≤9)
    dp[1][i]=1
 
# (3)表の小さい方から答えにたどり着くまで埋める
# d=2~N
for d in range(2,N+1):
    # i=1~9
    for i in range(1,10):
        # (2≤d,i=1)
        if i==1:
            dp[d][i]=dp[d-1][i]+dp[d-1][i+1]
 
        # (2≤d,1≤i≤8)
        elif 2<=i<=8:
            dp[d][i]=dp[d-1][i-1]+dp[d-1][i]+dp[d-1][i+1]
 
        # (2≤d,i=9)
        else:
            dp[d][i]=dp[d-1][i-1]+dp[d-1][i]
 
        # 余りを取る
        dp[d][i]%=mod
 
# (4)答えを出力する
# N行目を全て足す
ans=sum(dp[N])%mod
 
# 答えの出力
print(ans)

ABC243 A

# 入力の受け取り
V,A,B,C=map(int,input().split())
 
# シャンプーを使う
# i=0~(10^10)
for i in range(10**10):
    # 父が使う
    V-=A
    # 残量がマイナスになったら
    if V<0:
        # 「F」を出力
        print("F")
        # 途中終了
        exit()
 
    # 母が使う
    V-=B
    # 残量がマイナスになったら
    if V<0:
        # 「M」を出力
        print("M")
        # 途中終了
        exit()
 
    # 高橋君が使う
    V-=C
    # 残量がマイナスになったら
    if V<0:
        # 「T」を出力
        print("T")
        # 途中終了
        exit()

ABC243 B

# 入力の受け取り
N=int(input())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
 
# 1番目の答え
ans1=0
 
# i=0~(N-1)
for i in range(N):
    # A[i]=B[i]ならば
    if A[i]==B[i]:
        # カウント
        ans1+=1
 
# 答えを出力
print(ans1)
 
# 2番目の答え
ans2=0
 
# i=0~(N-1)
for i in range(N):
    # j=0~(N-1)
    for j in range(N):
        # A[i]=B[j] かつ i≠j ならば
        if A[i]==B[j] and i!=j:
            # カウント
            ans2+=1
 
# 答えの出力
print(ans2)

ABC243 C

# 入力の受け取り
N=int(input())
 
# 座標
p=[]
 
# 人がいるy座標の記録セット
ySet=set()
 
# N回
for i in range(N):
    # 入力の受け取り
    X,Y=map(int,input().split())
    # 座標を記録
    p.append([X,Y])
    # y座標を記録
    ySet.add(Y)
 
# 入力の受け取り
S=input()
 
# defaultdictをインポート
from collections import defaultdict
 
# 左に動く人のx座標の記録
directL=defaultdict(list)
# 右に動く人のy座標の記録
directR=defaultdict(list)
 
# i=0~(N-1)
for i in range(N):
    # 人iのx,y座標
    x,y=p[i]
    # S[i]が「L」ならば
    if S[i]=="L":
        # 左に動く人として記録
        directL[y].append(x)
    # そうでなければ(S[i]が「R」ならば)
    else:
        # 右に動く人として記録
        directR[y].append(x)
 
# 各yについて
for y in ySet:
    # 左に動く人と右に動く人がそれぞれ1人以上いれば
    if 1<=len(directL[y]) and 1<=len(directR[y]):
        # 「右に動く人の最小x座標」<「左に動く人の最大x座標)」
        if min(directR[y])<max(directL[y]):
            # 「Yes」を出力
            print("Yes")
            # 終了
            exit()
 
# 「No」を出力
print("No")

ABC243 D

# 入力の受け取り
N,X=map(int,input().split())
S=input()
 
# 移動の記録
Move=[]
 
# i=0~(N-1)
for i in range(N):
    # ・記録が空の場合
    if len(Move)==0:
        # S[i]を記録
        Move.append(S[i])
   
    # ・記録が空でない場合
    else:
        # ・S[i]が「L」または「R」
        if S[i]=="L" or S[i]=="R":
            # S[i]を記録
            Move.append(S[i])
        # ・S[i]が「U」
        else:
            # ・S[i]が「U」かつ記録の末尾が「L」または「R」(「LU」「RU」になる場合)
            if Move[-1]=="L" or Move[-1]=="R":
                # 記録の末尾を消す
                Move.pop()
            # ・S[i]が「U」かつ記録の末尾が「U」
            else:
                # 「U」を記録
                Move.append("U")
 
# シミュレーション
for s in Move:
    # 「L」ならば2Xへ移動
    if s=="L":
        X*=2
    # 「R」ならば(2X+1)へ移動
    elif s=="R":
        X=2*X+1
    # 「U」ならばX//2へ移動
    else:
        X//=2
 
# 答えの出力
print(X)

ABC244 A

# 入力の受け取り
N=int(input())
S=input()
 
# Sの(N-1)文字目を出力
print(S[N-1])
# 入力の受け取り
N=int(input())
S=input()
 
# Sの右から1文字目を出力
print(S[-1])

ABC244 B

# 入力の受け取り
N=int(input())
T=input()
 
# 方向:最初は東
direct="East"
 
# 今いる座標
X=0
Y=0
 
# i=0~(N-1)
for i in range(N):
    # T[i]=「S」のとき
    if T[i]=="S":
 
        # 東向きの場合
        if direct=="East":
            X+=1
        # 南向きの場合
        elif direct=="South":
            Y-=1
        # 西向きの場合
        elif direct=="West":
            X-=1
        # 北向きの場合
        elif direct=="North":
            Y+=1
   
    # そうでない場合(T[i]=「R」の場合)
    else:
        # 方向を変える
        if direct=="East":
            direct="South"
        elif direct=="South":
            direct="West"
        elif direct=="West":
            direct="North"
        elif direct=="North":
            direct="East"
 
# 答えの出力
print(X,Y)
# 入力の受け取り
N=int(input())
T=input()
 
# 方向:0=東,1=南,2=西,3=北
d=0
 
# 今いる座標
X,Y=0,0
 
# i=0~(N-1)
for i in range(N):
    # T[i]=「S」のとき
    if T[i]=="S":
 
        # 向きによって分岐
        if d==0:X+=1
        elif d==1:Y-=1
        elif d==2:X-=1
        else:Y+=1
   
    # そうでない場合
    else:
        # 1プラスして4で割った余りを取る(3の次が1になる)
        d=(d+1)%4
       
# 答えの出力
print(X,Y)

ABC244 C

# 入力の受け取り
N=int(input())
 
# すでに使った数の記録
Used=[False]*(2*N+2)
 
# 最初は「1」を出力
print(1)
 
# 「1」は使用済み
Used[1]=True
 
# N回
for i in range(N+1):
    # 青木くんの入力を受け取り
    x=int(input())
    # 「x」は使った
    Used[x]=True
 
    # x=「0」の場合
    if x==0:
        # 終了
        exit()
   
    # k=1~(2k+1)
    for k in range(1,2*N+2):
        # まだ使っていないなら
        if Used[k]==False:
            # 「k」を出力
            print(k)
            # 「k」は使った
            Used[k]=True
            # forループを抜ける
            break

ABC244 D

# 入力の受け取り
S1,S2,S3=map(str,input().split())
T1,T2,T3=map(str,input().split())
 
# (1)3色すべて同じ位置
if S1==T1 and S2==T2 and S3==T3:
    print("Yes")
# (2)1色のみ同じ位置で2色は逆
elif S1==T1 or S2==T2 or S3==T3:
    print("No")
# (3)すべて違う位置
else:
    print("Yes")

ABC244 E

# pypyで提出
 
# 余りの定義
mod=998244353
 
# 入力の受け取り
N,M,K,S,T,X=map(int,input().split())
 
# (1)表を作る
# 「i回の移動でjにたどり着く方法のうち、Xを偶数回/奇数回通る方法の数」
# 初期値は全て0
dp=[[[0]*2 for i in range(N+1)] for j in range(K+1)]
 
# 辺の格納
edge=[]
 
# M回
for i in range(M):
    # 入力の受け取り
    U,V=map(int,input().split())
    # 辺の記録
    edge.append([U,V])
 
# (2)すぐにわかるところを埋める
# ・(p=S) dp[0][p][偶]=1
dp[0][S][0]=1
 
# (3)表の小さい方から答えにたどり着くまで埋める
# i=1~K
for i in range(1,K+1):
    # 各辺の組について
    for U,V in edge:        
        # U→V
        # V=Xの場合⇔Xを通る回数が増える⇔偶奇が入れ替わる
        # ・(1≤i,U→V,V=X) dp[i][V][偶]+=dp[i-1][U][奇]
        # ・(1≤i,U→V,V=X) dp[i][V][奇]+=dp[i-1][U][偶]
        if V==X:
            dp[i][V][0]+=dp[i-1][U][1]
            dp[i][V][1]+=dp[i-1][U][0]
 
        # V≠Xの場合⇔Xを通る回数が増えない⇔偶奇は同じ
        # ・(1≤i,U→V,V≠X) dp[i][V][偶]+=dp[i-1][U][偶]
        # ・(1≤i,U→V,V≠X) dp[i][V][奇]+=dp[i-1][U][奇]
        else:                
            dp[i][V][0]+=dp[i-1][U][0]
            dp[i][V][1]+=dp[i-1][U][1]
 
        # 余りを取る
        dp[i][V][0]%=mod
        dp[i][V][1]%=mod
 
        # 逆向きV→Uについても同様の処理を行う
        if U==X:
            dp[i][U][0]+=dp[i-1][V][1]
            dp[i][U][1]+=dp[i-1][V][0]
        else:                
            dp[i][U][0]+=dp[i-1][V][0]
            dp[i][U][1]+=dp[i-1][V][1]
        dp[i][U][0]%=mod
        dp[i][U][1]%=mod
 
# (4)答えを出力する
print(dp[K][T][0])

ABC245 A

# 入力の受け取り
A,B,C,D=map(int,input().split())
 
# A<Cの場合
if A<C:
    # 「Takahashi」を出力
    print("Takahashi")
 
# C<Aの場合
elif C<A:
    # 「Aoki」を出力
    print("Aoki")
 
# それ以外(A=Cの場合)
else:
    # B≤Dの場合
    if B<=D:
        # 「Takahashi」を出力
        print("Takahashi")
   
    # それ以外(D<Bの場合)
    else:
        # 「Aoki」を出力
        print("Aoki")

ABC245 B

# 入力の受け取り
N=int(input())
A=list(map(int,input().split()))
 
# x=0,1,2,...,2000
for x in range(2001):
    # xがAに含まれないならば
    if x not in A:
        # xを出力
        print(x)
        # 終了
        exit()

ABC245 C

# 入力の受け取り(A,Bは先頭に「0」を埋めている)
N,K=map(int,input().split())
A=[0]+list(map(int,input().split()))
B=[0]+list(map(int,input().split()))
 
# (1)表を作る
dp=[[False]*(N+1) for i in range(2)]
 
# (2)すぐにわかるところを埋める
# dp[A][0]=True,dp[B][0]=True
dp[0][1]=True
dp[1][1]=True
 
# (3)表の小さい方から答えにたどり着くまで埋める
# i=1~(N-1)
for i in range(1,N):
 
    # dp[A][i]=Trueならば
    # ⇔X[i]=A[i]の場合
    if dp[0][i]==True:
        # |X[i]-A[i+1]|=|A[i]-A[i+1]|≤Kならば
        if abs(A[i]-A[i+1])<=K:
            # dp[A][i+1]=True
            dp[0][i+1]=True
       
        # |X[i]-B[i+1]|=|A[i]-B[i+1]|≤Kならば
        if abs(A[i]-B[i+1])<=K:
            # dp[B][i+1]=True
            dp[1][i+1]=True
 
    # dp[B][i]=Trueならば
    # ⇔X[i]=B[i]の場合
    if dp[1][i]==True:
        # |X[i]-A[i+1]|=|B[i]-A[i+1]|≤Kならば
        if abs(B[i]-A[i+1])<=K:
            # dp[A][i+1]=True
            dp[0][i+1]=True
           
        # |X[i]-A[i+1]|=|B[i]-B[i+1]|≤Kならば
        if abs(B[i]-B[i+1])<=K:
            # dp[B][i+1]=True
            dp[1][i+1]=True
 
# (4)答えを出力する
# dp[A][N-1]=True または dp[B][N-1]=Trueならば
if dp[0][N]==True or dp[1][N]==True:
    # 「Yes」を出力
    print("Yes")
# どちらもFalseならば
else:
    # 「No」を出力
    print("No")

ABC245 D

# 入力の受け取り
N,M=map(int,input().split())
A=list(map(int,input().split()))
C=list(map(int,input().split()))
 
# Bを作る
B=[0]*(M+1)
 
# i=0~M
for i in range(M+1):
 
    # x=A[N-1]B[M-(i-1)]+A[N-2]B[M-(i-2)]+...+A[N-k]B[M-(i-k)]+...A[N-i]B[M]
    x=0
 
    # k=1~i
    for k in range(1,i+1):
        # (N-k)がマイナスでなければ
        if 0<=N-k:
            x+=A[N-k]*B[M-(i-k)]
        # マイナスならば
        else:
            # 次のforを抜ける
            break
    # 計算
    B[M-i]=(C[M+N-i]-x)//A[N]
   
# 答えの出力
print(*B)

ABC246 A

# 入力の受け取り
x1,y1=map(int,input().split())
x2,y2=map(int,input().split())
x3,y3=map(int,input().split())
 
# x1=x2の場合
if x1==x2:
    x4=x3
# x2=x3の場合
elif x2==x3:
    x4=x1
# x3=x1の場合
elif x3==x1:
    x4=x2
 
# y1=y2の場合
if y1==y2:
    y4=y3
# y2=y3の場合
elif y2==y3:
    y4=y1
# y3=y1の場合
elif y3==y1:
    y4=y2
 
# 答えの出力
print(x4,y4)

ABC246 B

# 入力の受け取り
A,B=map(int,input().split())
 
# mathをインポート
import math
 
# 計算
x=A/math.sqrt(A**2+B**2)
y=B/math.sqrt(A**2+B**2)
 
# 答えの出力
print(x,y)

ABC246 C

# 入力の受け取り
N,K,X=map(int,input().split())
A=list(map(int,input().split()))
 
# i=0~(N-1)
for i in range(N):
    # A[i]//X≤Kならば
    if A[i]//X<=K:
        # (A[i]//X)枚クーポンを使う
        K-=A[i]//X
        # 割引する
        A[i]-=(A[i]//X)*X
    # K<A[i]//Xならば(クーポンが足りなくてX円未満にできない場合)
    else:
        # 残りのクーポン(K枚)を全て使う
        A[i]-=K*X
        # クーポンを全て使ったので0枚になる
        K=0
       
# 大きい順に並び替え
A.sort(reverse=True)

# 初期値 i=0
i=0
# クーポンがまだ残っている限り
while i<N and 0<K:
    # A[i]にクーポンを使う=0円になる
    A[i]=0
    # クーポンを1枚使った
    K-=1
    # 次のiへ
    i+=1
 
# Aの合計=答え
print(sum(A))

ABC246 D

# pypyで提出
 
# 入力の受け取り
N=int(input())
 
# 関数にする
def f(a,b):
    return a**3+a**2*b+a*b**2+b**3
 
# 答え
ans=10**20
 
# b=0,1,2,...10^6
# (10^6より少し大きめにしている)
for b in range(10**6+100):
 
    # (1)左=区間の最小、右=区間の最大 とする
    # 左
    l=0
    # 右
    r=10**6+100
 
    # 1<(右-左)の間
    while 1<r-l:
        # (2)中央=(左+右)//2が条件を満たすか確認
        c=(r+l)//2
 
        # (3)(2)の結果より左または右を更新する
        # 計算結果がN未満なら
        if f(c,b)<N:
            # 左=中央と更新
            l=c
        # 計算結果がN以上なら
        else:
            # 右=中央と更新
            r=c
 
    # N≤f(l,b)ならば
    if N<=f(l,b):
        # f(l,b)がansより小さければ更新
        ans=min(ans,f(l,b))
    # そうでなければ(f(l,b)<N⇔f(r,b)≤N)
    else:
        # f(r,b)がansより小さければ更新
        ans=min(ans,f(r,b))    
 
# 答えの出力
print(ans)

ABC247 A

# 入力の受け取り
S=input()
 
# 「0」+「Sの0文字目」+「Sの1文字目」+「Sの2文字目」
S="0"+S[0]+S[1]+S[2]
 
# 答えを出力
print(S)

ABC247 B

# 入力の受け取り
N=int(input())
 
# 姓のリスト
sList=[]
# 名のリスト
tList=[]
 
# N回
for i in range(N):
    # 入力の受け取り
    s,t=map(str,input().split())
    # リストへ格納
    sList.append(s)
    tList.append(t)
 
# i=0~(N-1)
for i in range(N):
    # (1)i≠jとなるsi,ti(他の人の姓、名)のリストを作る
    # 「i番目の人以外の姓、名が入ったリスト」
    OtherNameList=[]
    # j=0~(N-1)
    for j in range(N):
        # i≠jならば(自分以外の姓、名をリストに入れるため)
        if i!=j:
            # j番目の人の姓をリストに追加
            OtherNameList.append(sList[j])
            # j番目の人の名をリストに追加
            OtherNameList.append(tList[j])            
 
    # si,tiが両方ともにリストへ含まれていないかを確認する
    if sList[i] in OtherNameList and tList[i] in OtherNameList:
        # 含まれていたら「No」
        print("No")
        # 終了
        exit()
   
# 「Yes」を出力
print("Yes")

ABC247 C

# 入力の受け取り
N=int(input())
 
# S1
S=[1]
 
# i=2~N
for i in range(2,N+1):
    # Siを作る
    S=S+[i]+S
 
# 答えの出力
print(*S)

ABC247 D

# 入力の受け取り
Q=int(input())
 
# dequeをインポート
from collections import deque
# dequeを用意
que=deque()
 
# Q回
for i in range(Q):
    # 入力の受け取り(クエリ1,2で要素数が違うのでリストで受け取り)
    query=list(map(int,input().split()))
 
    # クエリ1
    if query[0]==1:
        # x,cを割り振り
        x=query[1]
        c=query[2]
 
        # 「数」「個数」の順で記録
        que.append([x,c])
 
    # クエリ2
    else:
        # cを割り振り
        c=query[1]
 
        # 答え
        ans=0
 
        # c(取り出す個数)が0より大きい間
        while 0<c:
            # queの左端の要素を取り出し
            # Num:数(Number)
            # Count:個数
            Num,Count=que.popleft()
 
            # 「個数」≤「取り出す個数」なら
            if Count<=c:
                # 全て取り出す
                # 「数」*「個数」を答えに加算
                ans+=Num*Count
                # 「個数」個取り出した
                # 残りの取り出す個数をマイナス
                c-=Count
 
            # 「取り出す個数」<「個数」なら
            else:
                # c個取り出して終わり
                # 答えに「数」*cを加算
                ans+=Num*c
                # 取り出した個数をマイナスして左端に戻す
                que.appendleft([Num,Count-c])
                # 取り出す個数を0にする
                c=0
       
        # 出力
        print(ans)

ABC248 A

# 入力の受け取り
S=input()
 
# 「0」がSに含まれないならば
if "0" not in S:
    # 「0」を出力
    print(0)
elif "1" not in S:
    print(1)
elif "2" not in S:
    print(2)
elif "3" not in S:
    print(3)
elif "4" not in S:
    print(4)
elif "5" not in S:
    print(5)
elif "6" not in S:
    print(6)
elif "7" not in S:
    print(7)
elif "8" not in S:
    print(8)
elif "9" not in S:
    print(9)
# 入力の受け取り
S=input()
 
# i=0~9
for i in range(10):
    # i(を文字列にしたもの)がSに含まれないならば
    if str(i) not in S:
        # iを出力
        print(i)

ABC248 B

# 入力の受け取り
A,B,K=map(int,input().split())
 
# AがB以上ならば
if B<=A:
    # 「0」を出力
    print(0)
    # 途中終了
    exit()
 
# i=1,2,3,...
for i in range(1,100):
    A*=K
    # スライムの数がB以上になったら
    if B<=A:
        # 「i」を出力
        print(i)
        # 途中終了
        exit()

ABC248 C

# pypyで提出
 
# 入力の受け取り
N,M,K=map(int,input().split())
 
# 余りの定義
mod=998244353
 
# (1)表を作る
dp=[[0]*(K+1) for i in range(N+1)]
 
# (2)すぐにわかるところを埋める
# ・(x≤M)dp[1][x]=1
# ・(M<x)dp[1][x]=0
for x in range(1,M+1):
    dp[1][x]=1
 
# (3)表の小さい方から答えにたどり着くまで埋める
# i=2~N
for i in range(2,N+1):
    # x=1~K
    for x in range(1,K+1):
        # j=1~(x-1)
        for j in range(1,x):
            # ・(2≤i,1≤j≤x-1)x-j≤Mならばdp[i][x]+=dp[i-1][j]
            if x-j<=M:
                dp[i][x]+=dp[i-1][j]
                # 余りを取る
                dp[i][x]%=mod
 
# (4)答えを出力する
# 答え
ans=0
 
# x=1~K
for x in range(1,K+1):
    # dp[N][1]~dp[N][K]の和
    ans+=dp[N][x]
    # 余りを取る
    ans%=mod
 
# 答えを出力
print(ans)

ABC248 D

# pypyで提出
 
# 入力の受け取り
N=int(input())
A=list(map(int,input().split()))
 
# 1,2,3,...が何番目にあるかの記録 左端には「0」を入れておく
Aindx=[[0] for i in range(10**6)]
 
# i=0~(N-1)
for i in range(N):
    # インデックス番号を記録
    # 1インデックスなので「i+1」を記録することに注意
    Aindx[A[i]].append(i+1)
 
# i=0~(N-1)
for i in range(10**6):
    # 右端に∞=10^6を追加
    Aindx[i].append(10**6)
 
# Xがあるインデックス番号のうちL以上で最小のもの
def NibutanLeft(X,L):
    # (1)左=区間の最小、右=区間の最大 とする
    # 左
    l=0
    # 右(=長さ-1)
    r=len(Aindx[X])-1
 
    # (4)1<(右-左)となっている間(2)~(4)を繰り返す
    while 1<r-l:
        # (2)中央=(左+右)//2が条件を満たすか確認
        # 中央=(左+右)//2
        c=(l+r)//2
 
        # (3)(2)の結果より左または右を更新する
        # ・(中央)番目の数がL以上
        if L<=Aindx[X][c]:
            # 左=中央と更新
            r=c
        # ・(中央)番目の数がLより小さい
        else:
            # 右=中央と更新
            l=c
 
    # 右を返す
    return r
 
# Xがあるインデックス番号のうちR以下で最大のもの
def NibutanRight(X,R):
    # (1)左=区間の最小、右=区間の最大 とする
    # 左
    l=0
    # 右(=長さ-1)
    r=len(Aindx[X])-1
 
    # (4)1<(右-左)となっている間(2)~(4)を繰り返す
    while 1<r-l:
        # (2)中央=(左+右)//2が条件を満たすか確認
        # 中央=(左+右)//2
        c=(l+r)//2
 
        # (3)(2)の結果より左または右を更新する
        # ・(中央)番目の数がR以下
        if Aindx[X][c]<=R:
            # 左=中央と更新
            l=c
        # ・(中央)番目の数がRより大きい
        else:
            # 右=中央と更新
            r=c
 
    # 右を返す
    return l
 
# 入力の受け取り
Q=int(input())

# Q回
for i in range(Q):
    # 入力の受け取り
    L,R,X=map(int,input().split())
 
    # 「Xがあるインデックス番号のうちL以上で最小のもの」
    Lindx=NibutanLeft(X, L)
    # 「Xがあるインデックス番号のうちR以下で最大のもの」
    Rindx=NibutanRight(X, R)
    # 答えを出力
    print(Rindx-Lindx+1)
# 入力の受け取り
N=int(input())
A=list(map(int,input().split()))
 
# 1,2,3,...が何番目にあるかの記録 左端には「0」を入れておく
Aindx=[[0] for i in range(10**6)]
 
# i=0~(N-1)
for i in range(N):
    # インデックス番号を記録
    # 1インデックスなので「i+1」を記録することに注意
    Aindx[A[i]].append(i+1)
 
# i=0~(N-1)
for i in range(10**6):
    # 右端に∞=10^6を追加
    Aindx[i].append(10**6)
 
# 入力の受け取り
Q=int(input())
 
# bisectをインポート
import bisect
 
# Q回
for i in range(Q):
    # 入力の受け取り
    L,R,X=map(int,input().split())
 
    # Lを大小関係を保ったままリストに挿入する位置のインデックス(同じ数があれば左側へ)
    Lindx=bisect.bisect_left(Aindx[X], L)
    # Rを大小関係を保ったままリストに挿入する位置のインデックス(同じ数があれば右側へ)
    Rindx=bisect.bisect_right(Aindx[X], R)
    # 答えを出力
    print(Rindx-Lindx)

ABC249 A

# 入力の受け取り
A,B,C,D,E,F,X=map(int,input().split())
 
# 残り時間
Time=X
# 高橋くんの進んだ距離
Taka=0
 
# ・0<(残り時間)である間
while 0<Time:
    # ・(進む時間)≤(残り時間)ならば
    if A<=Time:
        # (進んだ距離)に(進む時間*速度)をプラス
        Taka+=A*B
        # (残り時間)から(進む時間+休む時間)をマイナス
        Time-=A+C
    # ・(残り時間)<(進む時間)ならば
    else:
        # (進んだ距離)に(残り時間*速度)をプラス
        Taka+=Time*B
        # (残り時間)=0とする
        Time=0
 
# 残り時間
Time=X
# 青木くんの進んだ距離
Aoki=0
 
# ・0<(残り時間)である間
while 0<Time:
    # ・(進む時間)≤(残り時間)ならば
    if D<=Time:
        # (進んだ距離)に(進む時間*速度)をプラス
        Aoki+=D*E
        # (残り時間)から(進む時間+休む時間)をマイナス
        Time-=D+F
    # ・(残り時間)<(進む時間)ならば
    else:
        # (進んだ距離)に(残り時間*速度)をプラス
        Aoki+=Time*E
        # (残り時間)=0とする
        Time=0
 
# (青木くんが進んだ距離)<(高橋くんが進んだ距離)の場合
if Aoki<Taka:
    # 「Takahashi」を出力
    print("Takahashi")
# (高橋くんが進んだ距離)<(青木くんが進んだ距離)の場合
elif Taka<Aoki:
    # 「Aoki」を出力
    print("Aoki")
# (青木くんが進んだ距離)=(高橋くんが進んだ距離)の場合
else:
    # 「Draw」を出力
    print("Draw")

ABC249 B

# 入力の受け取り
S=input()
 
# 「大文字が存在するか?」を管理する変数
OmoziExist=False
# 「小文字が存在するか?」を管理する変数
KomoziExist=False
 
# x:Sの各文字
for x in S:
    # xが大文字なら
    if x.isupper()==True:
        # 「大文字が存在するか?」をTrueに
        OmoziExist=True
    # そうでない場合(xが小文字)
    else:
        # 「小文字が存在するか?」をTrueに
        KomoziExist=True
 
# 大文字が存在しない または 小文字が存在しないならば
if OmoziExist==False or KomoziExist==False:
    # 「No」を出力
    print("No")
    # 途中終了
    exit()
 
# Sの文字数
N=len(S)
 
# i=0~(N-1)
for i in range(N):
    # k=(i+1)~(N-1)
    for k in range(i+1,N):
        # 重複⇔(Sのi文字目)=(Sのk文字目)
        if S[i]==S[k]:
            # 「No」を出力
            print("No")
            # 途中終了
            exit()
 
# 「Yes」を出力
print("Yes")

# 入力の受け取り
S=input()
 
ans="Yes"
 
# Sが全て大文字または小文字なら「No」
if S.isupper() or S.islower():ans="No"
# Sをsetに展開した長さとSの文字数が一致していなければ「No」
if len(set(S))!=len(S):ans="No"
 
print(ans)

ABC249 C

# 入力の受け取り
N,K=map(int,input().split())
 
# Sを格納するリスト
SList=[]
 
# i=0~(N-1)
for i in range(N):
    # 入力の受け取り
    S=input()
    # リストへ格納
    SList.append(S)
 
# 答え
ans=0
   
# bitnum=(000...0)~(111...1)(長さNの2進数)
for bitnum in range(1<<N):
    # 暫定答え(tmp=tmporary:一時的な)
    anstmp=0
 
    # 選ばれた文字列の格納リスト
    Choosed=[]
 
    # shift=0~(N-1)
    for shift in range(N):
        # (bitnumをshift個右シフト) & 1 =1ならば
        if bitnum>>shift & 1:
            # 文字列を選ぶ
            # ⇔(Shift)番目の文字列をChoosedに格納
            Choosed.append(SList[shift])
 
    # code=97~122
    for code in range(97,123):
        # Alphabet=「a」「b」...「z」
        Alphabet=chr(code)
 
        # Alphabetが含まれる文字列の数をカウント
        InCount=0
 
        # T=Choosedに含まれる文字列を順に格納
        for T in Choosed:
            # TにAlphabetが含まれるなら
            if Alphabet in T:
                # カウントする
                InCount+=1
       
        # カウント=Kならば
        if InCount==K:
            # Alphabetが選んだ文字列のうちちょうどK個に含まれる
            anstmp+=1
 
    # ans_tmpのほうが大きければansを更新
    ans=max(anstmp,ans)
 
# 答えを出力
print(ans)

ABC249 D

# pypyで提出
 
# 入力の受け取り
N=int(input())
A=list(map(int,input().split()))
 
# 1,2,3,..がいくつ含まれるかカウントするリスト
Count=[0]*10**6
 
# i=0~(N-1)
for i in range(N):
    # 1,2,3,..がいくつ含まれるかカウント
    Count[A[i]]+=1
 
# 答え
ans=0
 
# i=0~(N-1)
for i in range(N):
 
    # Aj=1,2,3,...で試し割り
    Aj=1
    # Aj≤√A[i]⇔Aj^2≤A[i]の間
    while Aj**2<=A[i]:
        # 割り切れたら
        if A[i]%Aj==0:
            # Akを確認
            Ak=A[i]//Aj
 
            # Aj=Akならば
            if Aj==Ak:
                # (Ajの個数)*(Akの個数)
                ans+=Count[Aj]*Count[Ak]
            # Aj≠Akならば
            else:
                # (Ajの個数)*(Akの個数)*2
                # AjとAkを入れ替えできるため2倍する
                ans+=Count[Aj]*Count[Ak]*2
 
        # 次のAjへ
        Aj+=1    
 
# 答えを出力
print(ans)

ABC250 A

# 入力の受け取り
H,W=map(int,input().split())
R,C=map(int,input().split())
 
# 答えの個数
ans=0
 
# 上マスが枠内にあるか
if 1<=R-1:
    # 答えにプラス1
    ans+=1
# 下マスが枠内にあるか
if R+1<=H:
    ans+=1
# 左マスが枠内にあるか
if 1<=C-1:
    ans+=1
# 右マスが枠内にあるか
if C+1<=W:
    ans+=1
 
# 答えの出力
print(ans)

ABC250 B

# 入力の受け取り
N,A,B=map(int,input().split())
 
# 外側の行
# NGyou=1~N
for NGyou in range(1,N+1):
    # 奇数の場合
    # ⇔2で割った余りが1
    if NGyou%2==1:
        # a=1~A
        for a in range(1,A+1):
            # 行の中身
            Gyou=""
            # 外側の列
            # NRretu=1~N
            for NRetu in range(1,N+1):
                # 奇数の場合
                # ⇔2で割った余りが1
                if NRetu%2==1:
                    # 白マスがB個
                    Gyou+="."*B
                # 偶数の場合
                else:
                    # 黒マスがB個
                    Gyou+="#"*B
            # 出力
            print(Gyou)
 
    # 偶数の場合
    else:
        # a=1~A
        for a in range(1,A+1):
            # 行の中身
            Gyou=""
            # 外側の列
            # NRretu=1~N
            for NRetu in range(1,N+1):
                # 奇数の場合
                # ⇔2で割った余りが1
                if NRetu%2==1:
                    # 黒マスがB個
                    Gyou+="#"*B
                # 偶数の場合
                else:
                    # 白マスがB個
                    Gyou+="."*B
            # 出力
            print(Gyou)

ABC250 C

# 入力の受け取り
N,Q=map(int,input().split())
 
# A=[0,1,2,...,N]
A=list(range(N+1))
# indx=[0,1,2,...,N]
indx=list(range(N+1))
 
# Q回
for i in range(Q):
    # 入力の受け取り
    x=int(input())
 
    # xのインデックス番号を確認
    xIndx=indx[x]
 
    # 右端でない⇔xのインデックス番号≠Nの場合
    if xIndx!=N:
        # xの右のボールに書いている番号
        RightX=A[xIndx+1]
        # 入れ替える
        A[xIndx],A[xIndx+1]=A[xIndx+1],A[xIndx]
        # インデックス番号を更新する
        indx[x]=xIndx+1
        indx[RightX]=xIndx
   
    # 右端⇔xのインデックス番号=Nの場合
    else :
        # xの左のボールに書いている番号
        LeftX=A[xIndx-1]
        # 入れ替える
        A[xIndx],A[xIndx-1]=A[xIndx-1],A[xIndx]
        # インデックス番号を更新する
        indx[x]=xIndx-1
        indx[LeftX]=xIndx
 
 
# Aを出力
# 0番目は不要なので1番目~
# 「*」をつけると[]なしで出力できる
print(*A[1:])

ABC250 D

# エラトステネスの篩
def Eratosthenes(N):
    # 素数であるかの判定リスト
    IsPrime=[True]*(N+1)
 
    # i=2,3,4,...
    i=2
    # i≤√Nまで⇔i^2≤Nまで
    while i**2<=N:
        # iが素数でなければ
        if IsPrime[i]==False:
            # 次のiへ
            i+=1
            continue
       
        # k=2,3,4,...
        k=2
        while i*k<=N:
            # iの倍数は素数でない
            IsPrime[i*k]=False
            # 次のkへ
            k+=1
 
        # 次のkへ
        i+=1
 
    # 素数リスト
    PList=[]
 
    # i=2~N
    for i in range(2,N+1):
        # iが素数ならば
        if IsPrime[i]==True:
            # リストへ入れる
            PList.append(i)
 
    # リストを返す
    return PList
 
# 入力の受け取り
N=int(input())
# 10^6以下の素数リストを作成
P=Eratosthenes(10**6)
 
# 答え
ans=0
 
# 素数リストの長さ
lenP=len(P)
 
# 最後の素数の番号(0インデックス)
k=lenP-1
 
# i=0~(lenP-1)
for i in range(lenP):
 
    # p=i番目の素数(0インデックス)
    # q=k番目の素数(0インデックス)
    # p*q^3≤Nとなるまでkを減らしていく
    while i<k and N<P[i]*P[k]**3:
        k-=1
 
    # k≤iとなったら
    if k<=i:
        # 答えの出力
        print(ans)
        # 途中終了
        exit()
 
    # i+1,i+2,...,k番目の素数までqとして使用できる
    # ⇔(k-i)個
    ans+=k-i
def Eratosthenes(N):
    IsPrime=[True]*(N+1)
 
    i=2
    while i**2<=N:
        if IsPrime[i]==False:
            i+=1
            continue
       
        k=2
        while i*k<=N:
            IsPrime[i*k]=False
            k+=1
 
        i+=1
 
    PList=[]
 
    for i in range(2,N+1):
        if IsPrime[i]==True:
            PList.append(i)
 
    return PList
 
# 入力の受け取り
N=int(input())
# 素数リストを作る
P=Eratosthenes(10**6)
 
# 素数リストの長さ
lenP=len(P)
 
# 二分探索
def Nibutan(i):
    # 左
    l=0
    # 右
    r=lenP-1
 
    # 1<(右-左) ならば
    while 1<(r-l):
        # 中央=(左+右)//2
        c=(l+r)//2
 
        # P[i]=i番目の素数
        # P[c]=c番目の素数
        # 条件を満たすなら
        if P[i]*P[c]**3<=N:
            # 左=中央と更新
            l=c
        # 条件を満たさないなら
        else:
            # 右=中央と更新
            r=c
 
    # 左を返す
    return l
 
# 答え
ans=0
 
# i=0~(素数リストの長さ-1)
for i in range(lenP):
    # P[i]*P[k]^3≤Nとなるもののうち最大のk
    k=Nibutan(i)
    # i<kならば
    if i<k:
        # (k-i)個プラス
        ans+=k-i
    # そうでないなら
    else:
        # 探索終了
        break
 
# 答えを出力
print(ans)
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