オイラーパンチ220最大公約数機能をAcWing

トピック:https://www.acwing.com/problem/content/222/

問題の意味:範囲1-N、GCD(x、y)を求めているが素数の数であります

アイデアは:まず、各素数pについて、次に彼の貢献は、それが[N / P 1]互いに素数は右、これは実際に我々が使用することができ、各数、オイラー累積値の範囲を横断されるべきであることができるときそして、プレフィックスは、その後、計算します

<ビット/ STDC ++ H>の#include
 の#define MAXN 10000005
 の#define LEN 100005
 の#define MOD十億七
 使用 名前空間STDを、
typedefの長い 長いLL。
LLマーク[MAXN]。
【MAXN] PHI LL。
LL PRI [MAXN]。
LL和[MAXN]。
int型のTOT; 
LLのn; 
ボイドgetphi()//欧拉表
{ 
    PHI [ 1 ] = 1 int型 iは= 2 ; iが<= N iが++ 
    { 
        場合(マーク[I]!){PHI [I] = I- 1 ; PRI [++ TOT = I;}
        INT J = 1 ; J <= TOTあり、j ++ 
        { 
            int型 X = PRI [J]。
            もし(私は、x> N *)破ります
            マーク[iが = X *] 1 もし(I%のX == 0){PHI [iが* X] = PHI [i]は* X。破る;}
             それ以外のファイ[を私は* X] = PHI [i]は* PHI [X]; 
        } 
    } 
} 
int型のmain(){ 
    scanf関数(" %のLLD "、&N)
    getphi(); 
    合計が[ 0 ] = PHI [ 0];
    以下のためにint型 i = 1 ; iは= N <; iは++)合計[i]は=和[I- 1 ] + ファイ[I]。
    LLのNUM = 0 以下のためにint型 I = 1 ; I <= TOT; iは++ ){ 
        NUM + = 2 *和[N / PRI [I]] - 1 
    } 
    のprintf(" %のLLD " 、NUM)。
}

 

おすすめ

転載: www.cnblogs.com/Lis-/p/11285843.html