解説

Sx(N)S_x(N) の個数 Sx(N)|S_x(N)| を考えてみましょう。整数 ii について、j=1ij=i(i+1)2\displaystyle\sum_{j=1}^{i}j = \frac{i(i+1)}{2} より、この値が xx の倍数であるためには i(i+1)i(i+1)2x2x の倍数、つまりi(i+1)0mod2xi(i+1)\equiv0\mod 2x となれば良いです。

では、このような ii を探してみます。 ここで、唐突に 2x2x を素因数分解し、その結果を 2x=k=1Kpkek\displaystyle 2x = \prod_{k=1}^{K}{p_k^{e_{k}}} とします。このとき、任意の kk について、

i(i+1)0i0,1modpkeki(i+1) \equiv 0 \longleftrightarrow i \equiv 0,-1 \mod p_k^{e_{k}} が成り立ちます。(i(ii+1i+1 は互いに素であることから))

一方で、i(i+1)0mod2xk,i(i+1)0modpkeki(i+1) \equiv 0 \mod 2x \longleftrightarrow \forall k, i(i+1) \equiv 0 \mod p_k^{e_{k}} が成り立つため(検証は追記にて)、

それぞれの kk について i0,1modpkeki \equiv 0,-1 \mod p_k^{e_{k}} が成り立てばよいと分かります。このような条件を満たす ii は、各 kk について i0i \equiv 0i1i \equiv -1 (modpkek)(\mod p_k^{e_{k}})22 通りから選ぶので、合計で 2K2^K 通りです。これら 2K2^K 通りの imod2xi\mod 2x を列挙し、列挙した ii それぞれについて 11 から NN までの中に2x2x で割ったあまりが ii となるような整数が何個あるかを求めることで Sx(N)|S_x(N)| を求めることができます。

計算量について考えます。まず、素因数分解は試し割り法を用いて O(a)O(\sqrt{a}) です。 2K2^K 通りの ii の値の列挙に関して、各 ii の構築において拡張ユークリッドの互除法を用いた中国剰余定理に O(Kloga)O(K\log{a}) かかるため、列挙全体で O(2KKloga)O(2^KK\log{a}) かかります。ここで、 KK の上限は、2×a2 \times a までの整数のうち、最も多くの素因数をもつ整数における素因数の個数の上限であり、Sp=235711131719232931<2×1012<Sp×37S_p = 2⋅3⋅5⋅7⋅11⋅13⋅17⋅19⋅23⋅29⋅31 < 2 \times 10^{12} < S_p \times 37 から K11K \leq 11 であるので、問題ありません。よって全体として O(a+2KKloga)O(\sqrt{a}+2^KK\log{a}) となり、これは十分高速です。

追記

  • i(i+1)0mod2xk,i(i+1)0modpkeki(i+1) \equiv 0 \mod 2x \longleftrightarrow \forall k, i(i+1) \equiv 0 \mod p_k^{e_{k}}

まず \longrightarrow は明らかです。i(i+1)i(i+1)2x2x の倍数であるとき、任意の kk について pkekp_k^{e_{k}}2x2x の約数より、i(i+1)i(i+1)pkekp_k^{e_{k}} の倍数となります。 また、\longleftarrow も明らかです。任意の kk について i(i+1)i(i+1)pkekp_k^{e_{k}} が割り切れるとき、pkekp_k^{e_{k}} 同士は互いに素であるので、それらの積である 2x2xi(i+1)i(i+1) で割り切ることができます。