ABC163 復習

unratedになってしまったのは残念でしたね。
とはいえ、「解く」ことは大事なので、やってみました。
今回はCまですんなり解けました。

A問題

円周の長さを求める問題でした。
円周の長さを求める公式(直径×π)と、小数の扱いに気を付ければ解けますね。
pythonでは、mathモジュールにpiという定数があるので、これを使えば楽です。

import math
R = int(input())
print((R * 2) * math.pi)

B問題

問題を単純化すると、ある値の集合の合計がN以下であるか?を問うてる問題です。
そのため、配列要素の合計を求めるsumと、ifが使えれば答えが求まります。

N, M = map(int,input().split())
A = list(map(int, input().split()))

if N < sum(A):
    print(-1)
else:
    print(N - sum(A))

C問題

与えられた配列の各要素がいくつずつ出ているか?の結果を別の配列に保持しておくことで答えが出せます。
答えの配列であるansに対しては、配列要素-1のインデックスに対して1を足すようにします。

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

ans = [0] * N
for n in A:
    ans[n - 1] += 1

for n in ans:
    print(n)

D問題

10100という、よくわからない数字に惑わされてしまいました。
10100は正直無視してよくて、「0~Nまでの数字から、K個選ぶ」という風に考えると答えが求めやすくなります。
(詳細な解説は以下を見たほうが良いかと。)

drken1215.hatenablog.com

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

MOD = 10 ** 9 + 7

ans = 0
for k in range(K, N + 2):
    first = k * (k - 1) / 2
    final = (N*2-k+1) * k / 2
    add = final - first + 1
    ans = (ans + add) % MOD

print(int(ans))

今回はここまでですね。
また来週。