解説

11からNNまでの自然数のうち、(aの倍数)(lcm(a,b)の倍数でない)(aの倍数) \cap (lcm(a,b)の倍数でない) となるような自然数の数を求めれば良いです。

  • 11からNNまでの自然数のうちのkkの倍数の個数は N/kN/kを整数値に切り捨てた値としてO(1)O(1)で求めることができます。
  • lcm(a,b)lcm(a,b)gcd(a,b)gcd(a,b)の値をユークリッドの互除法を利用して求めることでO(log(max(a,b)))O(log(max(a,b)))で求めることができます。

以上のことから、答えを求めることができます。時間計算量はユークリッドの互除法がボトルネックとなり、O(log(max(a,b)))O(log(max(a,b))) です。コンピューターは一秒に 10610^6 回の計算ができるため、 本制約においては余裕を持って実行時間制限に間に合います。 よって、この問題を解くことができました。

追記

この問題の制約において、C++のlonglong型の最大値(約9×10189 \times 10^{18}) を lcm(a,b)lcm(a,b) が超えてしまうことが考えられます。よって、C++のような固定長の整数を扱う場合は次のように考えます。

  • lcm(a,b)=abgcd(a,b)\displaystyle lcm(a,b) = \frac{ab}{gcd(a,b)} より、N<lcm(a,b)N < lcm(a,b)

つまり、N<abgcd(a,b)Nb<agcd(a,b)\displaystyle N < \frac{ab}{gcd(a,b)} \Longleftrightarrow \frac{N}{b} < \frac{a}{gcd(a,b)} のとき lcm(a,b)lcm(a,b)で割り切れる11からNNまでの自然数は0個 と判定、そうでなければ実際にlcm(a,b)lcm(a,b)で割り切れる11からNNまでの自然数の数を求める、という感じで実装することでオーバーフローを回避しながら計算を進めることができます。