相關題目:<br /> http://acm.hdu.edu.cn/showproblem.php?pid=2824 pku 2478(與前n個數互質的個數的求和)<br /> http://acm.hdu.edu.cn/showproblem.php?pid=3508 素因子的積<br /> http://acm.hdu.edu.cn/showproblem.php?pid=2710 題目很簡單,就是輸出N個數素數因子最大的那一個<br /> http://acm.hdu.edu.cn/showproblem.php?pid=3307 (歐拉 + 推導公式 + gcd)<br /> http://acm.hdu.edu.cn/showproblem.php?pid=1299 (求因子個數)<br /> http://acm.pku.edu.cn/JudgeOnline/problem?id=2480 歐拉求所有因子的和<br /> http://acm.pku.edu.cn/JudgeOnline/problem?id=2407 很水的歐拉<br /> http://acm.hdu.edu.cn/showproblem.php?pid=1787 典型 歐拉函數<br />http://acm.hdu.edu.cn/showproblem.php?pid=3501 歐拉函數求小於N且與N不互質的正整數之和</p><p>在數論中,歐拉定理(也稱費馬-歐拉定理)是一個關於同餘的性質。歐拉定理表明,若n,a為正整數<br />,且n,a互素,(a,n) = 1,則 a^φ(n) ≡ 1 (mod n)<br />推論:對於互質的數a、n,滿足a^(φ(n)+1) ≡ a (mod n)<br />費馬定理: a是不能被質數p整除的正整數,則有a^(p-1) ≡ 1 (mod p)<br /> 證明這個定理非常簡單,由於φ(p) = p-1,代入歐拉定理即可證明。<br /> 同樣有推論:對於不能被質數p整除的正整數a,有a^p ≡ a (mod p)<br />若n是質數p的k次冪,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因為除了p的倍數外,其他數都跟n互質。<br /> 歐拉函數是積性函數——若m,n互質,φ(mn)=φ(m)φ(n)。<br /> 特殊性質:當n為奇數時,φ(2n)=φ(n), 證明於上述類似。<br />歐拉性質:<br />phi(n) >= sqrt(n / 2) n > 0<br />n > 6 phi(n) >= sqrt(n)<br />n 為合數 phi(n) <= n - sqrt(n)<br />推論一:歐拉函數ψ(N)的值為偶數。<br />推論二:對於任意素數p有ψ(p)=p-1<br />推論三:設N為質數P的平方,即N=P×P,則ψ(N)=(P-1)×P。<br />推論四:設N為質數p的n次方(n≥2)則ψ(N)=N×(1-1/p)<br />推論五:設N為兩個不同質數p,q之積,N=p ×q,則ψ(N)=(p-1)×(q-1)。<br />推論六:對一切正整數n,有φ(p^n)=[p^(n-1)]*(p-1)</p><p>歐拉函數的定義:E(k)=([1,n-1]中與n互質的整數個數). 因為任意正整數都可以唯一表示成如下形式:<br /> k=p1^a1*p2^a2*……*pi^ai;(即分解質因數形式)<br /> 可以推出:E(k)=(p1-1)(p2-1)……(pi-1)*(p1^(a1-1))(p2^(a2-1))……(pi^(ai-1))<br /> =k*(p1-1)(p2-1)……(pi-1)/(p1*p2*……pi);<br /> =k*(1-1/p1)*(1-1/p2)....(1-1/pk)<br /> ps:在程式中利用歐拉函數如下性質,可以快速求出歐拉函數的值(a為N的質因素)<br />若(N%a==0 && (N/a)%a==0) 則有:E(N)=E(N/a)*a;<br />若(N%a==0 && (N/a)%a!=0) 則有:E(N)=E(N/a)*(a-1);<br />跟據上面的公式,可以得到關於歐拉函數的遞推關係:<br />假設素數p能整除n,那麼<br />如果p還能整除n / p, PHI(n) = PHI(n / p) * p;<br />如果p不能整除n / p, PHI(n) = PHI(n / p) * (p - 1);</p><p>得數學結論:一個整數的所有因子數等於其每個素因子的個數加一之後的乘積(1+p1)(1+p2)…(1+pn)<br />因子和: 若 k=p1^a1*p2^a2...*pi^ai F(k) = (p1^0+...+p1^a1)*(p2^0+...+p2^a2)*...*(pi^0 + ... + pi^ai)<br />,其中p1、p2、...、pn分別為該整數的所有n個素因子P1、P2、...Pn的相應個數。<br />思想:得到一個整數所有素因子。由素因子的組合構造其所有的因子。<br />一個整數的素因子還有一個特點,就是超過其平方根值的素因子最多隻有一個</p><p>結合率((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p<br />((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p<br />交換率(a + b) mod p = (b+a) mod p<br />(a × b) mod p = (b × a) mod p<br />分配率((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p<br />定理(消去律):如果gcd(c,p) = 1 ,則 ac ≡ bc mod p 可以推出 a ≡ b mod p<br />(拉格朗日四平方和定理)<br />每個自然數均可表示成4個平方數之和。3個平方數之和不能表示形式如4k(8n+ 7)的數。 如果在<br />一個正整數的因數分解式中,沒有一個數有形式如4k+3的質數次方,該正整數可以表示成兩個平方數<br />之和。<br />char mark[10000] = {0};<br />int prime[1230];<br />int size = 0;<br />int phi[10000];<br />int main () {<br /> int i, j;<br /> /*篩法求素數*/<br /> for (i = 2; i < 10000; i++) {<br /> if (!mark[i]) prime[size++] = i;<br /> for (j = 0; j < size && prime[j] * i < 10000; j++) {<br /> mark[prime[j] * i] = 1;<br /> if (i % prime[j] == 0) break;<br /> }<br /> }<br /> /*求歐拉函數*/<br /> phi[1] = 1;<br /> for (i = 2; i < 10000; i++) {<br /> if (!mark[i]) {<br /> phi[i] = i - 1;<br /> continue;<br /> }<br /> for (j = 0; j < size && prime[j] * prime[j] <= i; j++) {<br /> if (i % prime[j] == 0) {<br /> if (i / prime[j] % prime[j] == 0)<br /> phi[i] = prime[j] * phi[i / prime[j]];<br /> else<br /> phi[i] = (prime[j] - 1) * phi[i / prime[j]];<br /> break;<br /> }<br /> }<br /> }<br /> return 0;<br />}<br />從別人那裡學到的對求歐拉函數部分的最佳化,使每個數的歐拉函數只由它的最小素因子求出:<br /> phi[1] = 1;<br /> for (i = 1; i < 10000; i++) {<br /> for (j = 0; j < size && prime[j] * i <= 10000; j++) {<br /> if (i % prime[j] == 0) {<br /> phi[prime[j] * i] = prime[j] * phi[i];<br /> break;<br /> }<br /> else {<br /> phi[prime[j] * i] = phi[i] * (prime[j] - 1);<br /> }<br /> }<br /> }</p><p>在實際代碼過程可以和搜尋質數的"篩子法"相結合, 因為"篩子法"相當於優先找到了每個數的最小質<br />因子.<br />const int size = 1000001;<br />int factor[size]; //factor[n]記錄了n的最小質因子<br />bool visited[size];<br />int phy[size]; //phy[n]記錄了與n互質且小於n的個數.<br />void getPrime()<br />{<br /> memset(factor, -1, sizeof(factor));<br /> memset(visited, false, sizeof(visited));<br /> for (int i=2; i<size; i++)<br /> {<br /> if (visited[i])<br /> {<br />//這部分是遞迴關係的實現<br /> int k = i/factor[i];<br /> if (k%factor[i] == 0)<br /> {<br /> phy[i] = phy[k]*factor[i];<br /> }else{<br /> phy[i] = phy[k]*(factor[i] - 1);<br /> }<br /> continue;<br /> }<br /> phy[i] = i -1; //i本身是質數, 與i互質的個數為i-1.<br /> for (int j=i+i; j<size; j+=i)<br /> {<br /> visited[j] = true;<br /> if (factor[j] == -1)<br /> {<br /> factor[j] = i; //用i篩的過程, 就找到了每個以i為最小質因子的數.<br /> }<br /> }<br /> }<br />結合率((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p<br />((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p<br />交換率(a + b) mod p = (b+a) mod p<br />(a × b) mod p = (b × a) mod p<br />分配率((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p<br />定理(消去律):如果gcd(c,p) = 1 ,則 ac ≡ bc mod p 可以推出 a ≡ b mod p<br />(拉格朗日四平方和定理)<br /> 每個自然數均可表示成4個平方數之和。3個平方數之和不能表示形式如4k(8n+ 7)的數。 如果在<br />一個正整數的因數分解式中,沒有一個數有形式如4k+3的質數次方,該正整數可以表示成兩個平方數<br />之和。</p><p>http://hi.baidu.com/xiehuixb/blog/item/a14cfd3967df1ffbb211c7dc.html</p><p>http://menjitianya2007.blog.163.com/blog/#m=0&t=1&c=fks_095074086095082075083085074064093083080066082080095</p><p>http://hi.baidu.com/xiehuixb/blog</p><p>