5455 bzoj

メビウス反転

回答要求する$の\ sum_ {i = 1} ^ {n}は{\シグマ(I ^ {2})} $

それを変換します

设$ F(I)= \ sum_ {D | I} {\ MU(D)^ {2}} $

答えは同じです

$ \ sum_ {i = 1} ^ {N} \ sum_ {D | I} {F(D)} $

なぜ、そう考える、私たちが見つけ、各$ I ^ {2} $の除数は、列挙型が$私は^ {2} $ iが$除数$ d個の$、$ dです$ ^ {数の約$ 2}

$ I $の素数$ pが$除数を提供仮定$ I ^ {2} $定性分解後、インデックスは、$ iはの^ $ pが$回の2 $を除数次に、$ A $です$ [0,2a] $かもしれ

その後、我々は、$ Dに^が、{2}により、$ $ $ 2Bの数であり、$ I素数、範囲$ Dが$する$ B $の回数は$除数$ dが$、$ P $列挙します列挙$ d個の$我々は、すべての$ 2B \当量2aは$を列挙することができます

しかし、ではない奇数インデックスの列挙に、列挙時間の$ D $の$ Dが$除数、$ Fを求めて(D)$と、同等のは、すべての$ 2B $ $ -1 $を列挙するならば、そうこれは、すべての奇数と偶数のケースをカバーしています。

簡素化を続行

$ ANS = \ sum_ {i = 1} ^ {N} \ sum_ {D | I} \ sum_ {D | D} {\ MU(D)^ {2}} $

最も外側に言及したの$ D $の

$ ANS = \ sum_ {D = 1} ^ {n}は{\ MU(D)^ {2} S([\ FRAC {n}は{D}])} $

$ S(N)= \ sum_ {i = 1} ^ {n}が{[\ FRAC {n}は{I}]} $

$することができますO(\ sqrtの{n}は)アウト時に$

検討する前に

$ \ sum_ {i = 1} ^ {n}は{\ MU(I)^ {2} = \ sum_ {i = 1} ^ {\のSQRT {N}} {\ MU(I)[\ FRAC {N } {I ^ {2}}]} $

かもしれ$ O(\のSQRT {N})$を見つけます

全体的な複雑さの$ O(N ^ {\ FRAC {2} {3}})$

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型 MAXN = 1E6 + 5 int型のn;
int型のミュー[MAXN]、pは[MAXN]、[MAXN]マーク。
LLのF(int型N){
    LL RET = 0 以下のためにint型 i = 1 ; iが* I <= N; ++ I)RET + = 1LL * MU [I] *(N /(1LL * iは* I))。
    リターンRET;
}
無効{INITを()
    MU [ 1 ] = 1 以下のためにint型 I = 2、I <MAXN; ++ I){
         場合(!マーク[I]){
            P [ ++のp [ 0 ] = I。
            ミュー[I] = - 1 
        }
        INTの J = 1 ; J <= P [ 0 ] && iは* P [j]が<MAXN; ++ j)は{
            マーク[私は * Pの[jを]] = 1 ;
            もし(I%P [J] == 0ブレーク
            ミュー[私は = j]と[pは*] - ムー[i]は、
        }
    }
}
LL gを(int型N){
    LL RET = 0 以下のためにint型 i = 1、jは、iがn = <; iは= J + 1 ){
        J = N /(N / I)。
        題する + = 1LL *(J - I + 1)*(N / I)。
    }
    戻る権利を。
}
INT {main()の
    その中に();
    int型 T; scanf関数(" %のD "、&T)。
    一方、(T-- ){
        scanf関数(" %のD "、&N)
        LL ANS = 0になりました=、0、前= 0 ;
        以下のためにint型 i = 1、jは、iがn = <; iは= J + 1 ){
            J = N /(N / I)。 = F(j)は、
            ANS + = 1LLの*のG(N / I)*(今- PRE)。 = 今;
        }
        printf(" %LLDする\ n " 、ANS)。
    }
    リターン 0 ;
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/19992147orz/p/11406882.html