ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC179 C - A x B + C【Python解答例】

AtCoderの練習としてAtCoder Beginner Contest179の問題C A x B + Cに取り組みました。
atcoder.jp

AtCoder Beginner Contest179 C - A x B + C

問題文

正整数Nが与えられます。
A×B+C=Nを満たす正整数の組 (A,B,C) はいくつありますか?

制約

2≤N≤10^6
入力はすべて整数

解答例

# coding:utf-8

n = int(input())

count = 0

for i in range(n):
    if i == 0:
        count += n - 1
    elif i == n:
        count += 0
    elif n % (i + 1) != 0:
        count += n // (i + 1)
    else:
        count += n // (i + 1) - 1

print(count)

解説

問題文からA×BがNより小さい値なら必ずCは存在するといえます。
なので、Nより小さいAとBの組み合わせが何個あるかを求めればいいと思います。

AとBの組み合わせの数は、AとBの2重ループで簡単に求まりそうですが、
時間切れになると思ったので試していません。
(詳しい説明ができないです…勉強不足)

例えばN=10、A=3のときに条件にあてはまるBは1~3となります。
(A,B,C)=(3,1,7),(3,2,4),(3,3,1)
つまりNをAで割ったときの商の数が求める条件を満たすので、
その商を足し合わせていって答えを求めました。
4種類 条件分けとして、
①A=1の場合:(A,B)=(N,1)のときCが存在しないので、Nから1を引いた数を足しました。
②A=Nの場合:①と同じ理由から、条件にあう組み合わせがありません。
③AでNが割り切れない場合:NをAで割ったときの商を足しています。
④AでNが割り切れる場合:例えばN=10、A=2の場合、(A,B)=(2,5)ではCが存在しないので、NをAで割った商から1を引いています。

もっとシンプルに求めることもできるかもしれませんので、
ほかの方の解法など勉強したいと思います。