我真的好想你
在每一个雨季
你选择遗忘的
是我最不舍的
如果发现本文有任何错误,欢迎留言指正或者联系 920861971@qq.com
前前置:
引入两个概念:
卷积:Convolution
是通过两个函数 $f$ 和 $g$ 生成第三个函数的一种数学算子。wiki
反演:Inversion
假设有两个函数$f$ 和 $g$ 满足:
已知 $g$ 求 $f$ 还是很水的。已知 $f$ 求$g$ 的过程称为反演。
现在反演一波(乱写),此处可以跳到前置:整除分块 很杂乱而且不是很清晰。
二项式反演:
前置:整除分块
引入:
整除分块是用来处理形如
的式子的方法。
当数据加强到$10^{10}$以上时,我们需要低于$O(n)$的更优秀的解法。
通过打表或者理性感知,我们可以发现,对于某些$\lfloor \frac{n}{i}\rfloor$,他们的值是相同的,并且呈块状分布。
由前任的经验,或者自己打表,发现对于一个块,假设它的起始位置的下标为 $l$ ,那么可以得到的是,它的结束位置的下标为 $\lfloor\frac{n}{\lfloor\frac{n}{l}\rfloor}\rfloor$
再写程序时候,要注意除法除0的情况,一般是会判断一下n/l的。1
2
3
4
5
6
7
8
9
10
11
12
13
14//求\sum_{i=1}^n n/i
//枚举左端点和右端点,右端点n/(n/l)
//右端点要想清楚,注意除数除0的情况,一般是会判断一下n/l的。
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans+=(n/l)*(r-l+1);
}
//如果求\sum_{i=1}^n n/i A[i]
//树状数组访问前缀和。
for(int l = 1; l <= n; l = r+1){
r = n / (n/l);
ans += query(n/l)*(r-l+1);
}
一些题目
- bzoj1257整除分块
题意:
给定n,k。求$\sum_{i=1}^{n} k \ mod\ i。$思路:
首先有$k \bmod i = k - \lfloor \frac{k}{i}\rfloor*i$
原式等价于求 $n*k-\sum_{i=1}^{n}( \lfloor \frac{k}{i}\rfloor \times i)$
对于每个区间的 $(l,r)$ ,等差数列搞一搞,得到公式为 $(k/l)\times (r-l+1) \times (l+r)/2$
- P2424 约数和
题意:
$f(x)=\sum{d|x} d$ 求$\sum{i=X}^Y f(i)$
思路:
首先想到前缀和。$1\rightarrow y$ 的 减去 $1 \rightarrow (x-1)$ 的。
那么在$1 \rightarrow n$中会出现的约数显然有n个(即1→n每个数都可作为约数),则对于约数 $d,d\in [1,n]$ ,其对约数和的贡献为$ d\times \lfloor n/d \rfloor$,即$ans=\sum_{i=1}^n(i\times\lfloor \frac{n}{i}\rfloor)$。
然后对于$(i\times\lfloor \frac{n}{i}\rfloor)$直接数论分块套上等差数列求和就好了。
$s=(n/l)\times (l+r)\times(r-l+1)/2;$
题意:
给定$1\le n,k\le 1e7$,求$\sum{i=1}^n\sum{d|n}d^k \ mod \ 1e9+7$的值
思路:
$\sum{i=1}^n\sum{d|n}d^k = \sum_{i=1}^n(i^k\times \lfloor \frac{n}{i} \rfloor)$ $\because i^k$不同 所以不能数论分块。观察到数据范围,叉掉$n \ logn$做法,考虑线性筛。
令$f(i) = i ^ k$,不难发现这个是积性函数。于是有$f(a\cdot b)=f(a)\cdot f(b)$线性筛递推,$O(n)$复杂度。
题意:
$\sum{i=1}^n\sum{j=1}^m(n \ mod \ i) \times (m \ mod \ j), i\neq j \ mod\ 19940417$的值。
思路:
- 做这种题,看到不熟悉的模数,先看看他是不是质数,能不能因式分解。发现$19940417 = 7 \times 2848631$。不管有没有用 ,都先分解出来。
- 开始推式子:先不管$i\neq j$的条件。
原式 $= \sum{i=1}^n(n-i\cdot \lfloor n/i\rfloor) \sum{j=1}^m(m-j\times\lfloor m/j\rfloor)=(n^2-\sum{i=1}^n(i\times\lfloor n/i\rfloor))(m^2-\sum{j=1}^m(j\times\lfloor m/j\rfloor))$
老套路分块等差数列求和 ,这一步可以解决
- 下面考虑$i == j$的情况,
$jianqu = \sum{i=1}^{min(n,m)}(n-i\times\lfloor n/i\rfloor)\times(m-i\times\lfloor m/i\rfloor) = \sum{i=1}^{min(n,m)}(n\times m+i^2\times\lfloor n/i\times m/i\rfloor-n\times i\times \lfloor m/ i \rfloor - m\times i\times \lfloor n/ i \rfloor )$
对于$n\times m $ 累加,对于$n\times i\times \lfloor m/i\rfloor $和$m\times i\times \lfloor n/i\rfloor $ 还是老套路,数论分块套等差数列。
对于比较难求的 $i^2\times \lfloor n/i \times m/i \rfloor$此时应用平方求和公式$1^2+2^2+……+n^2=\frac{n(n+1)(2n+1)}{6}$前缀搞一搞就行了
- P2260 [清华集训2012]模积和
数论函数基础知识
几个定义
- 数论函数:定义域为正整数的函数。(没特殊提及情况下以下函数均为数论函数)
- 积性函数:如果a,b满足$gcd(a,b) = 1$;则有$f(ab) = f(a)(b)$
- 完全积性函数:$\forall a,b$ ,满足$f(ab) = f(a)(b)$
几个性质和例子
- 欧拉函数:$\varphi(n) = \sum_{i=1}^n[gcd(i,n)==1]$,是积性函数。
- 莫比乌斯函数:$\mu$,当n有平方因子的时候,$\mu(n)=0$,否则设 $n$ 为 $k$ 个不同质因子的乘积。$\mu(n) = (-1)^k$。
- 除数函数:这不是完全积性函数,$\sigmaa n = \sum{d|n} d^a$。其中$d(n) = \sigma_0{n}$为n的因数个数,$\sigma_1(n) = \sigma(n)$为$n$的约数之和。
- 幂函数:完全积性函数。$id_k(n)$,表示$n^k$
- 单位函数:完全积性函数。$e(n) = [n = 1]$
Dirichlet卷积
定义:
函数$f$与$g$的Dirichlet卷积定义如下:
等价于
类似的,不难得出
性质:
- 交换律,结合律:略
- 分配律:$f(g+h)=fg+g*h$
证明如下: 单位元:$f*e=f$
证明如下:如果$f,g$都为积性函数,那么$f*g$也是积性函数。
证明如下:对于$h$,有
对于任意一个函数$f$,则一定存在一个函数$g$满足$f*g=e$,则$g$叫做$f$的Dirichlet逆。
计算Dirichlet卷积
设$h=f*g$
计算$h(n)$:根据定义,枚举因数,时间复杂度为$O(\sqrt n)$1
2
3
4
5
6
7
8
9
10
11
12
13
14
15h(n)=0;
for (int i=1;i*i<=n;i++){
if (n%i)
continue;
h(n)+=f(i)*g(n/i);
if (i*i!=n)
h(n)+=f(n/i)*g(i);
}
```
计算$h$,其中h的定义域为1~n,类似筛法,不难得到$O(n\ log\ n)$
```cpp
memset(h,0,sizeof h);
for (int i=1;i<=n;i++)
for (int j=1;i*j<=n;j++)
h(i*j)+=f(i)*g(j);
几个Dirichlet卷积
- 除数函数卷上1。$(1 = id_0)$
- 莫比乌斯函数与1的卷积:很重要!
其中 $k$ 为 $n$ 不同种类的质因数个数。
$\sum{d|n}\mu(n)=\sum{i=0}^{k}(-1)^i\times \binom{k}{i}=(1-1)^{k}=0^{k}$
其中,对于$0^0$没有定义,考虑到$k = 0$的只有$n = 1$,而$\mu (1) = 1$,所以有
$\sum_{d|n}\mu(n)=[n=1]=e(n)$ [P]表示P成立时候为1,否则为0。
所以就会有:$e = \mu * 1 $ 这里可以看出 $\mu$ 和 $1$在Dirichlet卷积的意义下互为逆元。记住这个式子!!这个对于莫比乌斯反演非常非常非常的重要!!!
- 常用的卷积: 考虑到,若d为n的因数,则$φ(d)$即与n的最大公约数为$\frac{n}{d}$的数的个数。所以:
- 关于幂函数
莫比乌斯反演
一些题目
思路:
杜教筛
利用Dirichlet卷积来构造递推式,从而对一些数论函数进行快速求和的方法。
杜教筛不像是传统的筛法(雾)
例子:
快速求$$
洲阁筛
MIN_25筛
一些阅读资料
我可能有些一些也没读过…(羞愧.jpg)
炫酷反演魔术 —VFleaKing