この質問は、深めの影響について書くためにここに、紫色の本からの問題を解決します
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 。 }