蒟蒻要開始打數論模板了。
尤拉函式:小於n且與
n互素的數個數,記為
φ(n)
它有這樣幾個優越的性質:
**
那麼直接給出實現**1. phi(p) == p-1 因為素數p除了1以外的因子只有p,所以與 p 互素的個數是 p - 1個
2. phi(p^k) == p^k - p^(k-1) == (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 mod p == 0, 那麼 phi(i * p) == p * phi(i) (證明略)
舉個例子:
假設 p = 3,i = 6,p * i = 18 = 2 * 3^2;
phi(3 * 6) == 18*(1-1/2)*(1-1/3) = 6
p * phi(i) = 3 * phi(6) = 3 * 6 * (1-1/2) * (1-1/3) = 6 = phi(i * p) 正確
4. 如果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
所以 phi(i * p) == phi(i) * (p-1).
再舉個例子:
假設i = 4, p = 3, i * p = 3 * 4 = 12
phi(12) = 12 * (1-1/2) * (1-1/3) = 4
phi(i) * (p-1) = phi(4) * (3-1) = 4 * (1-1/2) * 2 = 4 = phi(i * p)正確
#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define n 100001
typedef long long ll;
char xb[1<<15],*xt=xb,*xs=xb;
//#define getchar() (xs==xt&&(xt=(xs=xb)+fread(xb,1,1<<15,stdin),xs==xt)?0:*xs++)
inline int read()
while(ch<='9'&&ch>='0')
return f*x;
}bool nop[n*11];
ll phi[n*11],pri[n];
int size;
void getprime(int lim)
else phi[i*pri[j]]=phi[i]*(pri[j]-1);}}
}int main()
線性篩質數,線性求尤拉
本篇前半部分講線性篩質數,也叫尤拉篩,後半篇講解線性求尤拉函式。我們有一種篩質數的辦法,就是列舉每個質數,然後把這個質數的倍數都篩掉,這個做法比較簡單,在這裡不做過多介紹。尤拉篩就是在這個方法的基礎上,使得每個合數只會被它最小的那個質因子篩掉,保證了複雜度是線性的 memset isprime,1,...
線性篩尤拉函式
在數論,對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目,用 varphi n 表示。其中 p 1,p 2 p n 為 x 的所有質因數,x 是不為0的整數。varphi 1 1 當正整數p為質數時 varphi n n 1 尤拉函式是積性函式,當a與b互質時,滿足 varphi a tim...
線性篩求尤拉函式的證明
若 i 為質數,則 varphi i i 1 若 p j mid i 則 varphi i times p j varphi i times p j 若 p i nmid i 則 varphi i times p j varphi i times varphi j varphi i times p ...