源自 command_block(命令方块)的博客
当我们对于一些数论函数进行狄利克雷卷积作为乘法的时候,往往会遇到狄利克雷幂、狄利克雷逆之类的相关运算。
我们讨论的并不是一些作为多项式形式存在的函数,而是作为点值表达式存在的函数。我们限定这些函数的定义域都是 [ 1 , N ] ∩ Z [1,N]\cap\Z [1,N]∩Z 。
支撑这些运算的数学基础都是狄利克雷生成函数。
一个数论函数 f f f 对应的狄利克雷生成函数是
F ( x ) = ∑ i = 1 + ∞ f ( i ) i x F(x)=\sum_{i=1}^{+\infty}\frac{f(i)}{i^x} F(x)=i=1∑+∞ixf(i)
两个狄利克雷生成函数相乘,再换回数论函数的形式,就相当于一次狄利克雷卷积了,因为上式的 a x a^x ax 与 b x b^x bx 可以贡献到 ( a b ) x (ab)^x (ab)x 。这就可以保证,狄利克雷卷积的各种运算与多项式函数运算是性质相同的。
我们选择 1 i x \frac{1}{i^x} ix1 而不是 i x i^x ix ,因为后者不收敛。
本质是在狄利克雷生成函数上求导,不难得到
F ′ ( x ) = ( ∑ i = 1 + ∞ f ( i ) i x ) ′ = ∑ i = 1 + ∞ f ( i ) ln i i x = ∑ i = 1 + ∞ f ′ ( i ) i x F'(x)=\left(\sum_{i=1}^{+\infty}\frac{f(i)}{i^x}\right)'=\sum_{i=1}^{+\infty}\frac{f(i)\ln i}{i^x}=\sum_{i=1}^{+\infty}\frac{f'(i)}{i^x} F′(x)=(i=1∑+∞ixf(i))′=i=1∑+∞ixf(i)lni=i=1∑+∞ixf′(i)
得到 f ′ ( i ) = f ( i ) ln i f'(i)=f(i)\ln i f′(i)=f(i)lni 。不难发现 f ′ ( 1 ) = 0 f'(1)=0 f′(1)=0 。
但是此处 ln i \ln i lni 我们没法算,因此我们将 ln i \ln i lni 替换为 λ ( i ) \lambda(i) λ(i)( i i i 质因数分解后的幂次和),同样满足 λ ( a b ) = λ ( a ) + λ ( b ) \lambda(ab)=\lambda(a)+\lambda(b) λ(ab)=λ(a)+λ(b) 。 λ \lambda λ 函数可以 O ( n log n ) O(n\log n) O(nlogn) 预处理。
于是 f ′ ( i ) = f ( i ) λ ( i ) f'(i)=f(i)\lambda(i) f′(i)=f(i)λ(i) 。不难发现同样 f ′ ( 1 ) = 0 f'(1)=0 f′(1)=0 。
那么积分就是 f ( i ) λ − 1 ( i ) f(i)\lambda^{-1}(i) f(i)λ−1(i) ,需要特别注意的是,这里的积分并不是该函数的前缀和。另外,往往需要令 ( ∫ f ) ( 1 ) = 1 (\int f)(1)=1 (∫f)(1)=1 。
一般的函数往往不是积性函数,只能通过狄利克雷卷积的定义来进行运算:
F ( n ) = ∑ d ∣ n f ( d ) g ( n d ) F(n)=\sum_{d|n}f(d)g(\frac{n}{d}) F(n)=d∣n∑f(d)g(dn)
这里要强调的是,我们不要傻到通过枚举 n n n 以及其因数 d d d 来 O ( n n ) O(n\sqrt n) O(nn) 地计算。我们应该选择埃氏筛法。
为了方便理解和区分,下文都用 f [ i ] f[i] f[i] 而不是 f ( i ) f(i) f(i) 来表示整数 i i i 处的函数值。
已知数论函数 F F F ( F [ 1 ] = 1 F[1]=1 F[1]=1),求 G G G ,满足
F ∗ G = e F*G=e F∗G=e
我们令 G [ 1 ] = 1 G[1]=1 G[1]=1,剩下 > 1 >1 >1 的就是推式子了:
n > 1 , ∑ d ∣ n G [ d ] F [ n d ] = 0 G [ n ] F [ 1 ] + ∑ d ∣ n , d < n G [ d ] F [ n d ] = 0 G [ n ] = − ∑ d ∣ n , d < n G [ d ] F [ n d ] n>1,\sum_{d|n}G[d]F[\frac{n}{d}]=0\\ G[n]F[1]+\sum_{d|n,d
同样通过埃氏筛法递推,时间复杂度 O ( n log n ) O(n\log n) O(nlogn) 。
已知数论函数 F F F ( F [ 1 ] = 1 F[1]=1 F[1]=1),求 G G G ,满足
ln F = G \ln F=G lnF=G
我们对其求导( ln F ( i ) \ln F(i) lnF(i) 对 i i i 求导)再积分,可得:
G = ∫ F ′ F = ∫ ( F ′ ∗ F − 1 ) G=\int\frac{F'}{F}=\int(F'*F^{-1}) G=∫FF′=∫(F′∗F−1)
不难发现 G [ 1 ] = 0 G[1]=0 G[1]=0 。
时间复杂度 O ( n log n ) O(n\log n) O(nlogn) 。
已知数论函数 F F F ( F [ 1 ] = 0 F[1]=0 F[1]=0),求 G G G ,满足
ln G = F \ln G=F lnG=F
令 G [ 1 ] = 1 G[1]=1 G[1]=1 ,
两边求导推式子:
G ′ G = F ′ ⇒ G ′ = F ′ ∗ G G ′ [ n ] = ∑ d ∣ n G [ d ] F ′ [ n d ] = ∑ d ∣ n , d < n G [ d ] F ′ [ n d ] + G [ n ] F [ 1 ] λ ( 1 ) = ∑ d ∣ n , d < n G [ d ] F ′ [ n d ] \frac{G'}{G}=F'\Rightarrow G'=F'*G\\ G'[n]=\sum_{d|n}G[d]F'[\frac{n}{d}]=\sum_{d|n,d
用埃氏筛法递推,再积分一下就好了。
时间复杂度 O ( n log n ) O(n\log n) O(nlogn) 。
已知自然数 k k k 和数论函数 F F F ( F [ 1 ] = 0 F[1]=0 F[1]=0),求 G G G ,满足
G = F ∗ F ∗ . . . ∗ F = F k G=F*F*...*F=F^k G=F∗F∗...∗F=Fk
求 ln \ln ln 再 exp \exp exp 就行了:
G = exp ( k ln F ) G=\exp(k\ln F) G=exp(klnF)
时间复杂度 O ( n log n ) O(n\log n) O(nlogn) 。
已知数论函数 F F F ( F [ 1 ] = 0 F[1]=0 F[1]=0),求 G G G ,满足
G k = F G^k=F Gk=F
众所周知,多项式函数幂的 k k k 是可以直接对原模数取模的,狄利克雷也一样:
G = F k − 1 G=F^{k^{-1}} G=Fk−1
时间复杂度 O ( n log n ) O(n\log n) O(nlogn) 。
通篇都只需要埃筛,因此就不拉模板了。
「EC Final 2019」狄利克雷 k 次根 加强版