首先我們知道尤拉函式是1到n-1中與n互質的數的個數。
除此之外,我們還要知道一些性質:
當p是素數時
1. phi(p)=p-1。(不多bb)
2. phi(p^k)=(p-1)*p^(k-1)
證明:令n == p^k,小於 n 的正整數共有 p^k-1 個,其中與 p 不互素的個數共 p^(k-1)-1 個,它們是 1*p,2*p,3*p ... (p^(k-1)-1)*p
所以phi(p^k) == (p^k-1) - (p^(k-1)-1) == p^k - p^(k-1) == (p-1) * p^(k-1)。
3. 如果i%p==0,那麼phi(i*p)=p*phi(i);(自行理解)
4. 如果i%p!=0,那麼phi(i*p)=(p-1)*phi(i);
證明:因為尤拉函式是積性函式,所以有phi(i*p)=phi(i)*phi(p),然後p是素數,所以phi(i*p)=(p-1)*phi(i);
知道了上面的四個性質,相信大家就可以寫出線性篩法求尤拉函式的**了.
我用的是尤拉篩法的同時篩出尤拉數(啦啦啦):
int prime[1000045],cnt;int phi[1000045];
bool vis[1000045];
il void shai()
for(int j=1;j<=cnt;j++)
else
phi[i*prime[j]]=(prime[j]-1)*phi[i];//xing zhi 4
}}}
線性篩法(尤拉篩法)
嗯在剛剛 沒錯就是在幾分鐘之前 我學會了線性篩法 實在是乙個很好的篩法 正常的篩法,都會對乙個數篩多次 但是尤拉篩法不會 尤拉篩法是用它的最大因數去篩 別跟我說最小質因數,那個很難讓人理解 雖然最小質因數和最大因數是一樣的 我們假設乙個數k,它是t的最大因數 容易知道t是不唯一的 那我們要乘以乙個質...
線性篩法(尤拉篩)
從前有乙個素數篩法叫埃拉託斯特尼篩法,它的思想很簡單,把1 n以內素數的整數倍的數字劃掉,留下的就全是素數,但是它的複雜度是o nlglgn 對於大量不友好資料會跪,於是線性曬登場了。include using namespace std int prime 1100000 primesize,ph...
尤拉函式的線性篩法
尤拉函式 對正整數n,尤拉函式是小於等於n的數中與n互質的數的數目。尤拉函式又稱為 函式。下面是尤拉函式的一些性質 如果n為某乙個素數p,則 p 1 如果n為某乙個素數p的冪次p ap a pa,則 p ap a pa p 1 p a 1 p a 1 p a 1 如果n為任意兩個互質的數a,b的積,...