トピック: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)。 }