はじめに
前回
昨日のABC-Dを解きます。
#42
考えたこと
解説を読んでもすっきりしなかったのでけんちょんさんの記事を参考に実装しました。
この問題を考えるうえで大切なのは$10^{100}$が書かれている意図に気付くことです。解説記事にも書いているように$10^{100}$があることによって違う個数を選んだ場合に選んだ数字の和が重複することはなくなります。また、和は連続の整数になります。以上のことから、{0,1,...N+1}の中からkからN+1個選んだ数字の和を計算する問題と考えることができます。和の個数は($i個から作れる最大の整数-i個から作れる最小の整数+1$,$k\leq i \leq N+1$)と書くことができます。
$i$番目の最小の和は、$\frac{i(i-1)}{2}$、最大n番目からk番目の和は、$\frac{i(2N-i+1)}{2}$。これらを実装すると、
n, k = map(int,input().split())
ans = 0
for i in range(k,n+2):
minmin = (i*(i-1))//2 #変数名がひどい
maxmax = ((2*n-i+1)*i)//2
ans += maxmax - minmin + 1
print(ans%(10**9+7))
まとめ
今回のコンテストはC:簡単、D:少し簡単、E:は? だったのでDくらいは解けないといけないと思いました。ではまた、おやすみなさい