BZOJ 2693:jzptabメビウス乗法関数反転+ +ふるいです

コード:

#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を返します。
}

  



おすすめ

転載: www.cnblogs.com/guangheli/p/11086708.html