コード:
#include <ビット/ STDC ++ H> の#defineが長い長いっ の#define M 10001000 の#define MAXN 10200100 の#define MOD 100000009 名前空間stdを使用。 int型のCNT、TOT; int型VIS [MAXN]、μ[MAXN]、プライム[MAXN]。 LL hは[MAXN]、[MAXN] sumv。 INITを無効() { 私は、jはint型。 H [1] = 1。 (; iはMを<++ I I = 2)のために { (!VIS [I])%MODプライム[++ TOT = I、H [I] =(I-(LL)私を*)であれば、 用(J = 1; J <= TOT &&プライム[J] * iがM <; ++ j)を { VIS [プライム[J] * I] = 1。 IF(I%プライム[j] == 0) { H [プライム[J] * I] =(プライム[J] * H [I])%MOD。 ブレーク; } )(主int型 他H [プライム[J] * I] =(H [プライム[J]] * H [I])%MOD。 } } (i = 1; iがMを<; ++ i)に対するsumv [I] =(sumv [I-1] + H [i])と%MOD。 } LLのSUM(LLのX、LLのY) { Xの%= MOD、Yの%= MOD。 LL R1 =(X×(X + 1)>> 1)%MOD。 LL R2 =(Y×(Y + 1)>> 1)%MOD。 リターン(R1 * R2)%MOD。 } LLクエリ(LL N、LLのM) { int型I、最後に、再= 0、J。 IF(N> M)スワップ(N、M)。 用(i = 1; iは= N <; I = J + 1) { J =分(N /(N / I)、M /(M / I))。 + = SUM(N / I、M / I)*(sumv [J] -sumv [I-1])%MOD再。 %= MOD再。 } 復帰(再+ MOD)%MOD。 } { INIT()。 N INT、M、T。 scanf関数( "%のD"、&T)。 一方、(T--) { scanf関数( "%d個の%のD"、&N、&M)。 printf( "%のLLDを\ n"、クエリ(N、M))。 } 0を返します。 }