電波ビーチ

☆(ゝω・)v

ABC132に参加した(WIP Dまで)

残り30分で4完までいったところで酒を飲んだよね。

A - Fifty-Fifty

4文字からなる文字列が2種類の文字それぞれ2文字ずつから成るかどうか判定させられる。

無限に実装のバージョンがあるので好きなやつを使う(解説になってない)。

s = sorted(input())
if s[0] == s[1] and s[2] == s[3] and len(set(s)) == 2:
    print("Yes")
else:
    print("No")

B - Ordinary Number

ある数列の連続する3要素 p_{i-1}, p_{i}, p_{i+1} のうちp_{i}が2番目に小さいところになる箇所の数を求める。

なにげに 二番目に小さい が罠で、3数なので 二番目に大きい とも言えることに注意して、1からn-1までiの前後をみてやる

n = int(input())
arr = list(map(int, input().split()))
count = 0
for i in range(1, n - 1):
    if arr[i - 1] < arr[i] < arr[i + 1] or arr[i - 1] > arr[i] > arr[i + 1]:
        count += 1

print(count)

C - Divide the Problems

偶数個の要素をもつ数列を2つに分けるとき、一方の最大値がK以下、他方の最小値がK以上になるような整数Kはいくつあるだろうか。

ソートしたら真ん中の二要素の差になるのでそうする。

n = int(input())
arr = list(sorted(list(map(int, input().split()))))
print(arr[n//2] - arr[n//2 - 1])

D - Blue and Red Balls

要約が難しいので抽象的にすると、 N - K 個の赤玉を並べ、そのそれぞれの間(両端含む)に0個以上のK個の青玉を並べるときの並び方。

まず青玉を並べられる場所は赤玉の間および両端でありこれがN-K+1箇所。ここにK個の青玉をiグループに分けて並べるとして、_{N-K+1}C_i通りの選択ができる。nCrの組み合わせの数はググるアルゴリズムが出てくる。

ここまでわかって、じゃあ残りの、各グループにふりわけるK個の青玉の組み合わせってどうすんだろ、となってK=5くらいまで書き出してみるとどっかでみたことある分け方だと気づき、適当に「高校数学 グループ分け」みたいなワードでググって 二項係数とかいう単語にぶちあたり、それっぽかったので更に適当に「python 二項定理」でググって最初に出てきたやつをコピペして貼って計算。 毎回10**9+7であまりをだす。pythonなので桁は気にせず最後にやりゃいいだろ(と、ビクビクしながら提出)

二項定理をpythonで計算する - Qiita

# ncrをうまく使う感じ
# 二項定理はググった https://qiita.com/r_u__r_u/items/5e5baeb0194854cbf156

from math import factorial

n, k = map(int, input().split())
nn = n - k + 1  # 使える箇所


def ncr(n, r):
    res = 1
    for i in range(1, r+1):
        res = res * (n-i+1)//i
    return res


def calc(k):
    return [factorial(k)//(factorial(i)*factorial(k-i)) for i in range(k+1)]


nikouteiri = calc(k-1)

for i in range(1, k + 1):
    # 使える箇所からi個とり、kをi個のグループに分けたやつをかける
    print((ncr(nn, i) * nikouteiri[i-1]) % (10**9+7))

本番中解けなかったE, Fについては後日〜