AtCoder Beginner Contest 131 C - Anti-Division【Python】

https://atcoder.jp/contests/abc131/tasks/abc131_c

AtCoder ProblemsのRecommendationで Difficulty: 518、Solve Probability: 40%でした。

似たような問題を以前解いた記憶があったため、それほど時間がかからず解くことができました。

import math

A, B, C, D = map(int, input().split())
# CとDの最小公倍数
lcm_cd = C * D // math.gcd(C, D)
# A以上B以下の整数のうちCで割り切れるものの個数
cn = B // C - (A - 1) // C
# A以上B以下の整数のうちDで割り切れるものの個数
dn = B // D - (A - 1) // D
# A以上B以下の整数のうちCとDの最小公倍数で割り切れるものの個数
lcmcdn = B // lcm_cd - (A - 1) // lcm_cd
# A以上B以下の整数の個数から上記を加減すると答え
print((B - A + 1) - (cn + dn - lcmcdn))