1つの#include <ビット/ STDC ++。H> 2 の#defineっ長い長い 3 の#defineスキャン(I)のscanf( "%d個"、&I) 4 の#define scand(I)のscanf( "%のLF"、&I) 5 #定義 scanl(I)のscanf( "%のLLD"、&I) 6 の#define Fを(iは、、B)は(iは= int型、iが= Bを<; I ++)は 7 の#define PB(I)一back(I) 8 の#define PPB pop_back() 9 の#define PFのprintf 10 の#define DBG(引数...)COUT <<#1引数<< ":" <<引数<< ENDL。 11 使って 名前空間はstdを、 INT オイラー[最大]; 14 ボイドのinit(){ 15 オイラー[ 1。 =] 1。; 16 用(INT I = 2 ;私はマックス<; I ++が) 。17 オイラー[I] = I; 18である ため(INT I = 2。 I ++は、私は、マックス< ) 19 IF(オイラー[I] == I) 20である ため(int型 J = I; J <マックス; J + = I) 21は 、オイラー[J] =オイラー[J] / I *は(I- 1); // 最初の分割は、中間データのオーバーフロー防止するために行われる 22 } 23 // 一般式カウント 24 intをオイラー(INT N-){ // オイラーを返す(N-) 25 INT RES = N-、A = N-; 26である ため(INT I = 2、I *はI <= A; I ++は) { 27 IF(%のI == 0 ){ 28 RES = RES / I *は(I- 1); // 最初の分割の中間データのオーバーフロー防止するために行われる 29 ながら(I%==を0)、A / = I; 30 } 31である } 32 IF(A> 1。 RES = RES / A *(A-)1。); 33 リターンのres; 34 }
呼ばれる、最初の使用は、init();
私はオイラー関数値がオイラー[i]がAに格納されている対応します。
ここで、0 <私はマックス<;