@computerkiller
2021-03-25T16:04:17.000000Z
字数 2920
阅读 686
数学
对于一些奇怪的数论问题有奇效。也是对数论函数的另一种视角。
数列 的狄利克雷生成函数是
容易验证它的乘积就是狄利克雷卷积
狄利克雷函数初看非常的诡异,它和普通型与指数型不同,并不是一个形式幂级数。我们介绍一些典型的狄利克雷生成函数来了解它的性质。
过于显然地 ,也就是数论中的 函数,的狄利克雷生成函数是 1。
众所周知研究某型生成函数都要从 开始,也就是数论中的 函数,它的狄利克雷生成函数是
你可能已经在各种科普文上见过这个函数。这就是著名的黎曼 函数。
和 以及 不同,它的性质比较复杂,我们甚至不完全了解它的零点……不过这和接下来的介绍关系不大。
是一个(完全)积性函数,把 分解质因数后每个 对它的贡献是独立的,也就是说有下面的形式
这个形式会极大地方便我们讨论积性函数的性质。比如
当 时贡献为 ,当 时贡献为 ,否则贡献为 ,正是莫比乌斯函数 。也就是说
显然就是
同理,
显然有
有
从中可以立刻看出欧拉函数的筛法:
也就是说, 的贡献是
当质因数增加了一个 的时候按这个柿子更新贡献即可。
筛出 。
它就是 ,容易知道 的贡献是
我们继续来研究一下 DGF 的各种运算
下面我们讨论的 默认:
考虑:
高妙的高维前缀和可以做到 这里放板子题
事实上我们是要构造一个 满足:
复杂度是
先考虑求导好了 积分就是逆过程
求导的式子是:
我们记我们定义的这个函数是
那么显然有
愉快地可以进行求导了 积分就是这个的逆过程 不多说了
直接快进到:
性质还好:
这堆板子看着就很好写 来一个:
void derivation(int *f,int len,int *g)
{
for (int i = 1; i <= len; i++) g[i] = f[i] * c[i] % mod;
}
void integration(int *f,int len,int *g)
{
g[1] = f[1];
for (int i = 2; i <= len; i++) g[i] = f[i] * inv[c[i]] % mod;
}
void mul(int *f,int *g,int len,int *h)
{
for (int i = 1; i <= len; i++)
for (int j = 1; i * j <= len; j++)
h[i * j] = (h[i * j] + f[i] * g[j]) % mod;
}
void getinv(int *f,int len,int *g)
{
g[1] = 1;
for (int i = 1; i <= len; i++)
for (int j = 2; i * j <= len; j++)
g[i * j] = (g[i * j] - g[i] * f[j] % mod + mod) % mod;
}
void getln(int *f,int len,int *g)
{
derivation(f,len,A);
getinv(f,len,B);
mul(A,B,len,C);
integration(C,len,g);
for (int i = 1; i <= len; i++)
A[i] = B[i] = C[i] = 0;
}
void getexp(int *f,int len,int *g)
{
derivation(f,len,A);
g[1] = 1;
for (int i = 1; i <= len; i++)
{
if (i > 1) g[i] = g[i] * inv[c[i]] % mod;
for (int j = 2; i * j <= len; j++)
g[i * j] = (g[i * j] + g[i] * A[j]) % mod;
}
for (int i = 1; i <= len; i++)
A[i] = 0;
}