クルトンのプログラミング教室

Pythonの使い方やPythonを使った競技プログラミングの解法などを解説しています。

Pythonで解くAtCoder(エイシング プログラミング コンテスト 2020:A)

こんにちは、クルトンです!

この記事では
AtCoderの「エイシング プログラミング コンテスト 2020」のA問題をPythonを使って解説します。

問題のリンクを載せておきます。

atcoder.jp

この問題を解くのに必要な知識

  • 1行に複数の数字の入力があるときの受け取り方
  • for文


まず1行に複数の数字の入力があるときの受け取り方を説明します。

1行に複数の数字の入力があるときの受け取り方

map(int,input().split())

を使います。

今回の場合は

L, R, d = map(int,input().split())

とすることで入力を受け取れます。

簡単な解法

数えるための変数cntを用意し、L以上R以下の整数をfor文ですべて調べて、dの倍数であればcntを1増やすという方法です。

ここでrange関数の使い方を軽く復習しておきましょう。

range関数の使い方

range関数は引数の数によって働きが変わります。

今回は引数が二つの時について解説します。

引数が二つの時

コード

list(range(4, 7))	# range(a, b)

出力結果

[4,5,6]

このように、range関数の中に二つの数字a, bを入れると、aからb-1までの数字が連番が生成されます。(aからbまでではないので注意!)

これをfor文と組み合わせると

コード

for i in range(4, 7):
    print(i)

出力結果

4
5
6

というように、ひとつずつ要素を取り出すことができます。

なのでrange(L, R+1)とfor文で、LからRまでの要素を取り出し、一つずつ倍数判定をすることで答えを求めることができます。


以下にサンプルコードを載せておきます

atcoder.jp

少し難しい解法

1以上N以下の整数のうちdの倍数であるものの個数は、Nをdで割った商に等しいです。…①


証明

1以上N以下の整数のうちdの倍数であるものの個数をk個とする。
このとき

d, 2d, 3d, ..., kd

が1からNまでの中にあるので

kd ≤ N < (k+1)d

となる。

上の式を変換すると

N/d - 1 < k ≤ N/d

となる。よってkはNをdで割った商に等しい。//


また、「L以上R以下の整数のうち、dの倍数であるようなものの個数」は、「1以上R以下の整数のうちdの倍数であるようなものの個数」から「1以上L-1以下の整数のうちdの倍数であるようなものの個数」に等しいので、

①を用いて

答えは

[R/d] - [(L-1)/d]

となります。("[]"はガウス記号という少数以下を切り捨てる記号です。)


以下にサンプルコードを載せておきます

atcoder.jp

まとめ

今回は

  • for文とrange関数を使って調べる
  • 1以上N以下の整数のうちdの倍数であるものの個数は、Nをdで割った商に等しいことを利用する

という問題でした。

もし入力の受け取り方が分からなかった人は、それだけでもいいので覚えておきましょう!

ではまたお会いしましょう!さようなら~