迪利克雷生成函式

2022-04-07 23:42:13 字數 2516 閱讀 3090

對於數列 \(\\),定義 \(f\) 的 dirichlet 生成函式 \((\rm dgf)\) 為:

\[f(z)=\sum_^ \frac

\]不難發現 \((f\cdot g)(z)\) 為:

\[(f\cdot g)(z)=\sum_ \fracf_dg_}}

\]對於 dirichlet 卷積意義下的單位元 \(\epsilon\),其 dgf 為 \(\epsilon(z)=1\)

同時,我們定義的 \(i(n)=1\),其對應的 pgf 即為 \(\zeta(z)=\sum_^ \frac\),即 zeta 函式

\[(f\cdot g)(z)=\sum_ \fracf_dg_}}

\]等價於迪利克雷卷積逆。

\(f_1=1,f_^=1\)

\(\sum_f_df^_}=0\to f_n^=-\sum_ f_df^_}\)

可以在 \(\mathcal o(n\log n)\) 的時間複雜度解決。

例題:

dirichlet k 次根,即對於 \(g,k\) 計算 \(f^=g\)

要求乙個 \(\log\)(即倍增卷積無法通過)保證 \(g_1=1\)

\(n\le 10^6,k\le 10^9\),答案對 \(10^9+7\) 取模。

設 \(g=\ln f\),那麼 \(g'=\frac\)

於是\[g=\int f'\times f^

\]考慮求導:

\[\begin

&f(z)'=\bigg(\sum_n \frac\bigg)'

\\&=\sum_n f_n \bigg(\big(\frac\big)^z\bigg)'

\end\]

注意到 \((n^x)'=\exp(x\ln n)=n^x\ln n\)

於是有:

\[\begin

&f(z)'=\sum_n \frac\ln (\frac)

\\&f(z)'=-\sum_n \frac\ln n

\end\]

於是對於級數的變換即 \(f_n'=-f_n\ln n\)

問題來了,\(\ln n\) 在有理數域沒有定義。

不過我們知道最後會求一次積分,所以找乙個在求導意義下可以替換他的即可。

令 \(c(n)\) 表示 \(n\) 的質因子個數,那麼 \(c(nm)=c(n)+c(m)\)

這樣就可以解決 \(\ln\) 的問題了。

另一邊,我們考慮積分的問題,顯然積分即導數的逆運算,所以有 \(f_n'=-\frac\)

接下來考慮 \(\exp\) 了。

\(g=\exp(f)\to g'=gf'\)

於是有 \(g_n'=\sum_ g_df'_}\),故 \(-c(n)g_n=f_1c(1)\times g_n+\sum_ g_df_}'\)

即 \(g_n=-\frac\sum_ g_df_}'\)

對於 \(n=1\),\(g_1=1(f_1=1)\)

\(code:\)

#includeusing namespace std ;

#define next( i, x ) for( register int i = head[x]; i; i = e[i].next )

#define rep( i, s, t ) for( register int i = (s); i <= (t); ++ i )

#define drep( i, s, t ) for( register int i = (t); i >= (s); -- i )

#define re register

#define int long long

int gi()

while( cc >= '0' && cc <= '9' ) cn = cn * 10 + cc - '0', cc = getchar() ;

return cn * flus ;

}const int p = 998244353 ;

const int n = 1e6 + 5 ;

int n, k, f[n], g[n], ig[n], c[n], inv[n] ;

int top, isp[n], p[n / 10] ;

int fpow(int x, int k) return ans ;

}void init(int x)

} rep( i, 1, x ) inv[i] = fpow(c[i], p - 2) ;

}int h[n] ;

void fmul(int *a, int *b)

void fdev(int *a)

void fint(int *a)

void fexp(int *a) rep( i, 1, n ) a[i] = h[i], h[i] = 0 ;

}void fdiv(int *a) rep( i, 1, n ) a[i] = h[i], h[i] = 0 ;

}signed main()

狄利克雷生成函式

本篇討論的所有函式都是積性函式。若 f 為 dgf,則 f left s right 簡寫作 f 定義對於乙個數論函式,設在 i 處的點值為 f i 則定義它的狄利克雷生成函式 dgf dirichlet generating function 為 f left s right sum limits...

數論函式 狄利克雷卷積

開坑卷積 這裡說一下莫比烏斯函式的定義 定義兩個函式 f n g n 的狄利克雷卷積 為 f g n d nf d g nd 滿足交換律,結合律,分配律以及 f e f 都挺顯然的。這定義也是夠奇怪了,然後就可以搞很多事情 d n d n1 d 1 nd 1 1 n n d nid d 1 nd i...

狄利克雷卷積 狄利克雷卷積學習筆記

前置知識 1 常見的完全積性函式 恒等函式 i i n 1 單位函式 id id n n 元函式 epsilon epsilon n n 1 元函式卷積任何函式 f 都是 f 本身 2 常見積性函式 尤拉函式 varphi n 是小於n和n互質的自然數個數 莫比烏斯函式 mu n sigma sig...