#include
using namespace std;
const
int n =
1e5+10;
int tot ;
int mu[n]
;// 莫比烏斯函式
int phi[n]
;// 尤拉函式
int prime[n]
, vis[n]
;int d[n]
;// 約數個數
int a[n]
;// 每個數最小因子出現的次數
int sd[n]
, sp[n]
;// 求每個數的約數之和, sd維護和, sp維護最小因子 一項等比數列之和
void
get(
)for
(int j =
1;j <= tot && i * prime[j]
<= n ;j ++
) mu[i * prime[j]]=
- mu[i]
; phi[i * prime[j]
]= phi[i]
* phi[prime[j]];
d[i * prime[j]
]= d[i]
* d[prime[j]
], a[i * prime[j]]=
1;sd[i * prime[j]
]= sd[i]
* sd[prime[j]
], sp[i * prime[j]
]= sp[prime[j]]+
1;}}
}int
main()
線性篩素數 尤拉函式 莫比烏斯函式
常用的兩種素數篩法見部落格 http 這裡詳講線性篩,演算法複雜度o n 這個演算法的核心思想是 每乙個合數可以被唯一地表示成它的乙個最小質因子和另外乙個數的乘積。證明略。先上 const int n 1000000 int phi n prime n mu n bool vis n void in...
線性篩素數 尤拉函式 莫比烏斯函式
判斷素數 對於n,分別列舉1 sqrt n 最樸素的素數篩 埃拉託斯特尼篩法 sieve of eratosthenes 1 int primes maxn ent 0 2 bool isprime maxn 3void getprime 414 15 複雜度 nlglgn 尤拉篩 每個合數只會被乙...
尤拉篩(線性篩)求莫比烏斯函式
篩法我們肯定都不陌生,用來求一定序列內素數個數的方法麻,但在學習完埃氏篩法後 如果沒學過可以去學一下再看 我們發現它似乎做了很多多餘的操作,乙個數會被他的質所有篩 一遍,但我們本質上篩一遍就夠了,所以我們有沒有什麼方法去優化它呢?尤拉篩隨之而出,尤拉篩的特點便是乙個數隻會被它的最小質因子篩一遍,其它...