UVa1363

  この質問は、深めの影響について書くためにここに、紫色の本からの問題を解決します

  N、Mは、M <= Nは、2-Nを得られる満足する与える!存在する全てのXのようにMより大きい素因数のx個、M及びMは!互いに素、ユークリッドに相当するよりも、すべての素因数が大きいですアルゴリズム、

私たちは、XとM!のx%M!Mと!互いに素に変換互いに素ので、我々は唯一取得した後、数* N M!の数、より小さい列挙する必要があります!/ M!(数の平均増加Mは!まだオイラー関数であり、我々が使用し、互いに素!M!Mと数未満を取得するために、)の条件を満足する((N N phifacで)PHI(nは=、と私たちはphifacを見つけることができること !)) nが素数、(N)phifac = phifac(ない場合、関係phifac(N-1)は、それらの素因数とは、同じである傾向が N-1)* N さもなければphifac(N)= phifac(N -1)(* N-1)

これは、ノートオーバーフローのサイズphifac(N)の結果、私は詳細の一部、特に明確ではないよ、ここにコードは次のとおりです。

// UVA 11440 
の#include <cstdioを>  
する#include <CStringの> 
の#include <cmath> 
 使用して 名前空間はstd; 

const  int型 MAXN = 10000000 + 5 const  int型 MOD = 100000007 ; 

int型VIS [MAXN]、[MAXN] phifac。

無効エラトステネス(int型N){ 
    memsetの(VIS、0はsizeof (VIS))を、 
    INT、M = SQRT(N + 0.5 )。 
    以下のためにint型 I = 2 ; I <= M; ++I) 
       のためにint型 J =私は*; J <= N; J + = I)
        VIS [J] = 1 
} 

int型のmain(){ 
   int型、N M。
  エラトステネス(10000001 )。
  phifac [ 1 ] = phifac [ 2 ] = 1 以下のためにint型 = Iを3 ; iは= < 10000001 ++; I)
    phifac [i]は =(長い 長い)phifac [I- 1 ] *(VIS [I] I:I- 1)%MODと、
    
  同時に(scanf関数(" %D%D "、&​​N、&M)== 2 && N){    
     int型 ANS = phifac [M]。 
    以下のためにint型 iがm + = 1 ; iは= N <; ++ I)ANS =(長い 長い)ANS * I%MOD。
    printf(" %d個の\ n "、(ans- 1 + MOD)%MOD)。
  } 
  戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/yifeiWa/p/11454999.html