まっちは静かに暮らしたい

日々のアウトプットや技術系の備忘として。

PythonでABC132

こんにちは、まっちです。

今回は、PythonでABC132のA〜D問題を解きました。


atcoder.jp

A - Fifty-Fifty

4文字の文字列が、2種類の文字がそれぞれ2文字ずつ含まれるかを判定する。
対象が4文字と少ないので、全パターンを調べます。

S = str(input())

if S[0] == S[1]:
	if S[0] != S[2] and S[2] == S[3] :
		print('Yes')
	else:
		print('No')
else:
	if (S[0] == S[2] and S[1] == S[3]) or (S[0] == S[3] and S[1] == S[2]):
		print('Yes')
	else:
		print('No')
 


B - Ordinary Number

素数nの数列から連続する3要素を取り出した時に、真ん中の要素が2番目に大きくなるパターンを数え上げる。
3要素が単調増加/減少のパターンが該当するので、比較演算子を用いた判定を行う。

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

ans  = 0

for i in range(N-2):
	if (P[i] < P[i+1] and P[i+1] < P[i+2]) or (P[i] > P[i+1] and P[i+1] > P[i+2]):
		ans += 1

print(ans)
 


C - Divide the Problems

素数Nの数列を半分に分ける閾値Kはいくつあるかを求める。
数列をソートして、N/2の境界にある要素の差がKの数となります。

N = int(input())
D = list(map(int, input().split()))
D.sort()
M = int(N/2)
print(D[M]-D[M-1])
 


D - Blue and Red Balls

K個の青玉とN-K個の赤玉がある。
青玉がi個の区画に別れるような玉の並べ方の総数をiの値ごとに求める。

回答方針は以下としました。

  • 青玉をi個の区画に分ける組合せを求める。

 {}_{K-1}\mathrm{C}_{i-1}

  • その青玉区画をi個の仕切りとみなし、N-K個の赤玉とi個の仕切りの組合せを求める。

 {}_{N-K+1}\mathrm{C}_{i}

  • 上記の事象は独立のため、各組み合わせの積を取る。(重複組合せ)

 {}_{K-1}\mathrm{C}_{i-1}\times{}_{N-K+1}\mathrm{C}_{i}

import math

def comb(n,r):
	if n >= r:
		return math.factorial(n)//(math.factorial(n-r)*math.factorial(r))
	else:
		return 0

N, K = map(int, input().split())

for i in range(1,K+1):
	print(comb(K-1,i-1)*comb(N-K+1,i)%(10**9+7))
 




以上となります。
明日のABC133も頑張りましょう。

それでは。