計算量がよくわかりませんが、なぜかACできてしまったので書きます。(公式解説を見たら同じような解法が載ってました)
解法
問題の条件を言い換える。
まず、条件を満たすの組み合わせは、(であるような場合をさておくと)対称になるので、との関係はとりあえずとしてよい。
さらに、から、でなく、したがってであるので、条件はとすることができる。この条件下の解が出れば、これを2倍することで元の問題の解になる。
また、から、となることはないので、条件のうち、は削ることができる。
したがって、問題の条件はかつになる。
さらに言い換えると、またはであるようなの組み合わせが求まれば、全体からこれを引けば解がでるので、以降これを求めることとする。
これを求めるには、を範囲中全探索し、と互いに素な (から)、あるいはの倍数である (から)、の2つを求めて足しこめばよい。
後者については簡単に求められる。(です)
前者については、の約数の倍数でないような数を求めればよいが、実際には約数の倍数ではなく、素因数の倍数で十分である。の素因数はであることから最大でも個程度なので、包除原理を用いることで、区間]の中での素因数の倍数でない数を求めることができる。
これらを足し込んだ結果は、の条件において、元の問題で与えられた条件を満たさない場合の数であるので、のすべての組み合わせであるからこれを倍して引き、さらにの場合は元の問題の条件を満たさない(で割るとともにとなる)ため、を引いた数が最終的な解となる。
計算量
これが私にはわかりません…
の場合が最悪の場合ですが、かなり高速に動作します。
直感的には、だいたい多くの数の素因数はせいぜい個くらいだろう、みたいなテキトーな見積もりから、だったら最悪でもから程度になって通るだろう、という感覚で投げたら通りました。良くないですね…
コードは以下の通り。
Submission #35216632 - AtCoder Beginner Contest 206(Sponsored by Panasonic)