線性篩素數:
prime陣列中的素數是遞增的,當i能整除prime[j],那麼i*prime[j+1]這個合數肯定被prime[j]乘以某個數篩掉。因為i中含有prime[j],prime[j]比prime[j+1]小,即i=k*prime[j],那麼i*prime[j+1]=(k*prime[j])*prime[j+1]=k』*prime[j],接下去的素數同理。所以不用篩下去了。因此,在滿足i%prime[j]==0這個條件之前以及第一次
滿足改條件時,prime[j]必定是prime[j]*i的最小因子。
const線性尤拉函式int maxn = 10010, inf = 0x7fffffff
;int prime[maxn+1
];void
get_prime()}}
需要用到如下性質(p為質數):
1. phi(p)=p-1 因為質數p除了1以外的因數只有p,故1至p的整數只有p與p不互質
2. 如果i mod p = 0, 那麼phi(i * p)=p * phi(i) 證明如下
(上述證明存在bug。。感謝@primaryoier指教)
上面的過程證明了從區間[1,i]->[i+1,i+i],若整數n不與i互質,n+i依然與i不互質。下面給出另乙個證明:若整數n與i互質,n+i與i依然互質
3.若i mod p ≠0, 那麼phi(i * p)=phi(i) * (p-1)
i mod p 不為0且p為質數, 所以i與p互質, 那麼根據尤拉函式的積性phi(i * p)=phi(i) * phi(p) 其中phi(p)=p-1即第一條性質
const int maxn = 10010;int prime[maxn], phi[maxn];
bool vis[maxn];
int ans;
void get_prime()}}
void時間差距get_phi()
else
phi[i * prime[i]] = phi[i] * (prime[j] - 1
); }}}
when n = 10000eratosthenes_sieve(
1229): 0
(us)
euler_sieve(
1229): 0
(us)
when n = 100000
eratosthenes_sieve(
9592): 999
(us)
euler_sieve(
9592): 0
(us)
when n = 1000000
eratosthenes_sieve(
78498): 13004
(us)
euler_sieve(
78498): 7004
(us)
when n = 10000000
eratosthenes_sieve(
664579): 185130
(us)
euler_sieve(
664579): 79067
(us)
when n = 100000000
eratosthenes_sieve(
5761455): 2363692
(us)
euler_sieve(
5761455): 842592
(us)
when n = 1000000000
eratosthenes_sieve(
50847534): 25535159
(us)
euler_sieve(
50847534): 8987385(us)
**自大佬們
尤拉函式 素數篩
尤拉發現求小於等於n的正整數中有多少個數與n互質可以用這個公式 euler x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有素因數,x是不為0的整數。euler 1 1 唯一和1互質的數就是1本身 尤拉公式的延伸 乙個數的所有質因子之和是e...
線性篩素數(尤拉篩)
尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...
csu(尤拉函式 篩素數)
這真是一道好題啊!讓我wa了那麼多次,wa的原因是 大於根號n的質因子有且只有乙個,而我一開始都不懂這一點 題目鏈結 題意 輸入乙個n,a是n的所有因子之和,b是所有與n互質的數之和,求a b b比較容易求,所以先分析一下如何求b,首先我們要知道乙個結論如果x與n互質,那麼n x與n也互質,所以b ...