線性篩,積性函式,狄利克雷卷積,常見積性函式的篩法
一些性質
- 積性函式:對於函式\(f(n)\),若滿足對任意互質的數字\(a,b,a*b=n\)且\(f(n)=f(a)f(b)\),那麼稱函式f為積性函式。
- 狄利克雷卷積:對於函式f,g,定義它們的卷積為
\((f∗g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})\)。
狄利克雷卷積滿足很多性質:
交換律:\(f∗g=g∗f\)
結合律:\((f∗g)∗h=f∗(g∗h)\) - 兩個積性函式的狄利克雷卷積仍為積性函式。
- 積性函式都可以用線性篩篩出來
怎麼篩?
\(一般來講,只要知道f(P^k),P為質數,就可以知道怎麼篩了\)
\(簡單來講就是推一下\)
\(通俗來講就是手玩一下或者打表找規律\)
幾道題
一些常見積性函式的篩法
莫比烏斯函式\(\mu(n)\)
這個比較簡單,\(\mu(1)=1\),\(i\)為質數時\(\mu(i)=-1\),最小質因子篩到它的時候正負號反過來,否則為\(0\)
isprime[1] = 1; mu[1] = 1; for(int i = 2; i < N; ++i){ if(!isprime[i]){ prime[++num] = i; mu[i] = -1; } for(int j = 1; j <= num && i * prime[j] < N; ++j){ isprime[i * prime[j]] = 1; if(i % prime[j]) mu[i * prime[j]] = -mu[i]; else{ mu[i * prime[j]] = 0; break; } } }
乘法逆元\(inv(i)\)
求一個數在模p意義下的逆元
設\(p=i*x+j\),則\(i*x+j\equiv0(mod\ p)\)
同時除以\(i*j,所以x*j^{-1}+i^{-1}\equiv0(mod\ p)\)
移項\(i^{-1}\equiv-x*j^{-1}(mod\ p)\)
而\(x=p\ div\ i,j=p\ mod\ i\)
所以\(inv(i)=-inv(p\%i)*(p/i)\)
不用篩了,遞推就可以了
inv[1] = 1; for(int i = 2; i < p; ++i) inv[i] = -(p / i) * inv[p % i] % p + p) % p;
補充階乘逆元的遞推,求出\(inv(n)\),\(inv(i)=inv(i+1)*(i+1)\)倒著來就行了
fac[0] = inv[0] = 1;
for(int i = 1; i <= n; ++i) fac[i] = fac[i] * i % p;
inv[n] = Getinv(fac[n]); //Exgcd or Fermat
for(int i = 1; i < n; i++) inv[i] = inv[i + 1] * (i + 1) % p;
尤拉函式\(\varphi(n)\)
公式:
\(n分解成若干質數p的乘積n=\Pi p_i^{a_i}\)
\(\varphi(n)=n*\Pi(1-\frac{1}{p_i})\)
那麼\(\varphi(1)=1\),\(n為質數時\varphi(n)=n-1\),最小質因子篩到它時乘上質因子\(p-1\),否則乘上這個質數
isprime[1] = 1; phi[1] = 1;
for(int i = 2; i < N; ++i){
if(!isprime[i]){ prime[++num] = i; phi[i] = i - 1; }
for(int j = 1; j <= num && i * prime[j] < N; ++j){
isprime[i * prime[j]] = 1;
if(i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j] - 1);
else{ phi[i * prime[j]] = phi[i] * prime[j]; break; }
}
}
約數個數\(d(n)\)
公式:
還是分解
\(d(n)=\Pi(a_i + 1)\)
我們記錄下每個數最小質因子的指數記為\(pred\)就好了
isprime[1] = 1; d[1] = 1;
for(int i = 2; i < N; ++i){
if(!isprime[i]){ prime[++num] = i; d[i] = 2; pred[i] = 1; }
for(int j = 1; j <= num && i * prime[j] < N; ++j){
isprime[i * prime[j]] = 1;
if(i % prime[j]){
d[i * prime[j]] = d[i] * d[prime[j]];
pred[i * prime[j]] = 1;
}
else{
pred[i * prime[j]] = pred[i] + 1;
d[i * prime[j]] = d[i] / (pred[i] + 1) * (pred[i] + 2);
break;
}
}
}
約數的和\(\sigma(n)\)
公式:
又是分解
\(\sigma(n)=\Pi(\sum_{j=0}^{a_i}p_i^j)\)
這個就很煩了。。。
也可以篩,開兩個個數組,一個\(powd\)記錄每個數最小質因子的指數次冪,另一個\(sumd\)記錄每個數最小質因子\(\sum_{i=0}^{a}p^i\)就可以了
我們把這個鬼裡鬼氣的\(\sigma寫成f\)
isprime[1] = 1; f[1] = mu[1] = 1;
for(int i = 2; i < N; ++i){
if(!isprime[i]){
prime[++num] = i; f[i] = i + 1; mu[i] = -1;
sumd[i] = 1 + i; powd[i] = i;
}
for(int j = 1; j <= num && i * prime[j] < N; ++j){
isprime[i * prime[j]] = 1;
if(i % prime[j]){
sumd[i * prime[j]] = 1 + prime[j];
powd[i * prime[j]] = prime[j];
f[i * prime[j]] = f[i] * f[prime[j]];
}
else{
powd[i * prime[j]] = powd[i] * prime[j];
sumd[i * prime[j]] = sumd[i] + powd[i * prime[j]];
f[i * prime[j]] = f[i] / sumd[i] * sumd[i * prime[j]];
break;
}
}
}
完結
相關推薦
線性篩,積性函式,狄利克雷卷積,常見積性函式的篩法
一些性質 積性函式:對於函式\(f(n)\),若滿足對任意互質的數字\(a,b,a*b=n\)且\(f(n)=f(a)f(b)\),那麼稱函式f為積性函式。 狄利克雷卷積:對於函式f,g,定義它們的卷積為 \((f∗g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})\)。 狄利克雷卷積滿足
杜教篩(整除分塊,積性函式,尤拉與莫比烏斯,狄利克雷卷積)
參考資料 整除分塊: 當我們求∑ni=1f([ni])∑i=1nf([ni])的時候,如果1到n求一遍感覺太傻了,因為會有很多重複的計算,例如:n=10000時,i在[101,111]時,都有[ni]=9[ni]=9,所以我們只需要對所有數分成如上的一個
(數論一)積性函式與狄利克雷卷積
今天做的一道題就是有關積性函式與狄利克雷卷積的,很懵逼。覺得有必要學一手了 一. 積性函式是什麼呢? 對於函式f,對於任意的a,b互質,都有: f(a * b) = f(a) * f(b) 這樣的函式f就稱為積性函式,若a,b不互質也滿足上述條
6265丨數論丨積性函式 丨尤拉函式丨狄利克雷卷積丨思維變換
交題網址(HDU-6265) 題意:依次輸入一個整數分解質因數的各項底數與指數,求算: ∑d|nφ(d)×nd∑d|nφ(d)×nd 思路:(其實最開始還有些數學常識的不足,比如d|n
狄利克雷卷積&&杜教篩&&莫比烏斯反演
pos cnblogs title tar sdn aid www. article 前綴 狄利克雷卷積和莫比烏斯反演:鏈接 淺談一類積性函數的前綴和: 鏈接 賈誌鵬線性篩: 鏈接 讀賈誌鵬線性篩有感 (莫比烏斯函數的應用) 莫比烏斯函數 狄利
洛谷P3768 簡單的數學題(莫比烏斯反演+狄利克雷卷積+杜教篩)
ostream str lar .com 數學 logs tomato define show 傳送門 不會…… 兩篇加在一起都看不懂…… https://www.cnblogs.com/cellular-
莫比烏斯反演 狄利克雷卷積 杜教篩 學習筆記
前置知識:一些數論函式,比如尤拉函式、莫比烏斯函式的一些性質,積性函式及性質,整除分塊。 這裡預設大家會前置知識,如果不會請自行學習。 之前嘗試看過,結果後來都忘光了,於是還是決定應該寫個學習筆記記錄一下。 首先開始介紹莫比烏斯反演。 我們設
從狄利克雷卷積到杜教篩
狄利克雷卷積 積性函式 定義: 對於數論函式\(f\),若對於任意互質的數\(x,y\),滿足\(f(x*y)=f(x)*f(y)\),則\(f\)為一個積性函式。 事實上,我們見過的大部分數論函式都是積性函式,常見的如: \(\mu(x)\),莫比烏斯函式,在莫比烏斯反演有討論過。
P3768 簡單的數學題 [狄利克雷卷積,杜教篩,莫比烏斯反演]
簡單的數學題 題目連線 題目描述 輸入一個正整數n,n≤1010n,n\le 10^{10}n,n≤1010和p,p≤1.1×109p,p \le 1.1 \times 10^9p,p≤1.1×109
狄利克雷卷積與莫比烏斯反演
- 概念引入 - 數論函式 指定義域為正整數的函式 定義其加法為逐項相加,即$(f + g)(n) = f(n) + g(n)$ 定義其數乘為逐項相乘,即$(xf)(n) = x × f(n)$ - 單位元 單位元是集合中一種特別的元素,當單位元與其它元素
狄利克雷卷積學習筆記
狄利克雷卷積 得記下來,不然很容易忘記呀 數論函式 數論函式:定義域是正整數,值域是一個數集 兩個數論函式加法 ,逐項相加 $(f+g)(n) = f(n) + g(n)$ 數乘 , 這個數和每一項乘:$(xf)(n)=x*f(n)$ 積性函式:對於一個數論函式f滿足對於任意$(x,y)=1$,有$f(
BZOJ3601. 一個人的數論(高斯消元+狄利克雷卷積)
isp 一個 swap 由於 oid rac mod -m bzoj3 題目鏈接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 題解 首先還是基本的推式子: \[\begin{aligned}f_d(n) &am
BZOJ3601. 一個人的數論(高斯消元+狄利克雷卷積)及關於「前 $n$ 個正整數的 $k$ 次冪之和是 $k+1$ 次多項式」的證明
題目連結 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 題解 首先還是基本的推式子: \[\begin{aligned}f_d(n) &= \sum_{i = 1}^n [{\rm gcd}(i, n) = 1]i^d \\ &am
HDU6256 Master of Phi (狄利克雷卷積、歐拉函數)
urn can stdin () php lld 卷積 http bits UPC5044 #include <iostream> #include <bits/stdc++.h> using namespace std; con
莫比烏斯函數與狄利克雷卷積
交換 歐拉 整數 重要 dot 應該 不難 span 分配 積性函數 積性函數(數論函數,即定義域為正整數集或其子集的函數)定義 當\(f(n)=f(a)*f(b)\)對 任意\(a*b=n且gcd(a,b)=1\)成立時,我們稱\(f(x)\)為積性函數 特別的,當
DPMM(狄利克雷過程混合模型)淺解和新增似然函式的問題
先說說Dirichlet Process 要了解DP,推薦兩篇文章Redford Neal的Markov Chain Sampling Methods for Dirichlet Process Mixture Models 和 Xiaodong Yu的 Gi
狄利克雷分佈的matlab程式碼實現和R語言函式呼叫
主要參考的是:https://www.douban.com/note/45584915/ 和 http://www.biostatistic.net/thread-33740-1-1.html 最近需要用到狄利克雷分佈,但是找了半天發現matlab沒有現成的工具可用。只
狄利克雷函式為什麼不具有最小正週期
目錄 一、狄利克雷函式 二、狄利克雷函式為什麼是周期函式 三、狄利克雷函式為什麼沒有最小正週期 一、狄利克雷函式 狄利克雷(Dirichlet)函式如下所示: \[ D(x) = \begin
【學習筆記】 狄利克雷與莫比烏斯
數論 學習筆記 卷積 加法 結果 整數 class 知識 rac Ahead 10.9.2018 前置知識 數論函數 指一個正整數集對一個數集的映射 可以看成 N+->R 加法 若函數 \(f(x) + g(x) = h(x)\) 那麽 \(h(x) = \sum_{
伯努利分佈、二項分佈、多項分佈、貝塔分佈、狄利克雷分佈、高斯分佈
伯努利分佈: 伯努利分佈(Bernoulli distribution)又名兩點分佈或0-1分佈,介紹伯努利分佈前首先需要引入伯努利試驗(Bernoulli trial)。 伯努利試驗是隻有兩種可能結果的單次隨機試驗,即對於一個隨機變數X而言: 伯努利試驗都可以表達為“是或否”