进阶数论

进阶数论

莫比乌斯反演

整理自该博客

莫比乌斯函数( μ ( d ) \mu(d) μ(d)

定义如下:

  1. d = 1 d=1 d=1时, μ ( d ) = 1 \mu(d)=1 μ(d)=1
  2. d = ∏ i = 1 k p i d=\prod_{i=1}^{k}{p_i} d=i=1kpi,其中 p i p_i pi为互异质数,则 μ ( d ) = ( − 1 ) k \mu(d)=(-1)^k μ(d)=(1)k(注意没有次数大于2的因子)
  3. d d d中有幂次大于等于2的质因子, μ ( d ) = 0 \mu(d)=0 μ(d)=0

性质

  1. 对于正整数n
    ∑ d ∣ n μ ( d ) = { 1   n = 1 0   n ≠ 1 \sum_{d|n}{\mu(d)}=\begin{cases}1 &\ n=1\\0 &\ n\neq1\\\end{cases} dnμ(d)={10 n=1 n=1

n ≠ 1 n\neq 1 n=1时相当于 ( 1 − 1 ) n (1-1)^n (11)n的二项展开

  1. 对于正整数n

    ∑ d ∣ n μ ( d ) d = φ ( n ) n \sum_{d|n}{\frac{\mu(d)}{d}}=\frac{\varphi(n)}{n} dndμ(d)=nφ(n)(与欧拉函数联系起来)

  2. μ ( d ) \mu(d) μ(d)也为积性函数

线性筛求积性函数

求欧拉函数( φ ( n ) \varphi(n) φ(n)

分情况讨论

  1. p p p为质数, φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p1
  2. 最小质因子 p p p的幂次为1,即 i i i不包含 p p p φ ( i ∗ p ) = φ ( i ) ∗ φ ( p ) \varphi(i*p)=\varphi(i)*\varphi(p) φ(ip)=φ(i)φ(p)(积性函数性质)
  3. 最小质因子 p p p的幂次大于1,即 i i i包含 p p p φ ( i ∗ p ) = φ ( i ) ∗ p \varphi(i*p)=\varphi(i)*p φ(ip)=φ(i)p
int p[M];质数表
int cnt=0;
int f[M];//欧拉函数
bool flag[M];
void sieve()
{
    int i,j;
    f[1]=1;
    for(i=2;i<=n;i++)
    {
        if(!flag[i])
        {
            p[++cnt]=i;  
            f[i]=i-1; 
        }
          
        for(j=1;i*p[j]<=n;j++)
        {
            flag[i*p[j]]=true;
            if(i%p[j]==0)
            {
                f[i*p[j]]=p[j]*f[i];
                break;
            }
            f[i*p[j]]=f[i]*f[p[j]];
        }
    }  
}
求莫比乌斯函数( μ ( d ) \mu(d) μ(d)

分情况讨论

  1. p p p为质数, μ ( p ) = − 1 \mu(p)=-1 μ(p)=1
  2. i i i不包含 p p p μ ( i ∗ p ) = − μ ( i ) \mu(i*p)=-\mu(i) μ(ip)=μ(i)
  3. i i i包含 p p p μ ( i ∗ p ) = 0 \mu(i*p)=0 μ(ip)=0
int p[M];//质数表
int cnt=0;
int f[M];//莫比乌斯函数
bool flag[M];
void sieve()
{
    int i,j;
    f[1]=1;
    for(i=2;i<=n;i++)
    {
        if(!flag[i])
        {
            p[++cnt]=i;  
            f[i]=-1; 
        }
          
        for(j=1;i*p[j]<=n;j++)
        {
            flag[i*p[j]]=true;
            if(i%p[j]==0)
            {
                f[i*p[j]]=0;
                break;
            }
            f[i*p[j]]=-f[i];
        }
    }   
}
求约数个数 ( d ( n ) d(n) d(n))

注意还要保存最小质数的幂次

int p[M];质数表
int cnt=0;
int num[M];//最小质数的幂次
int f[M];
bool flag[M];
void sieve()
{
    int i,j;
    f[1]=1;
    num[1]=0;
    for(i=2;i<=n;i++)
    {
        if(!flag[i])
        {
      		num[i]=1;
            p[++cnt]=i;  
            f[i]=-1; 
        }
          
        for(j=1;i*p[j]<=n;j++)
        {
            flag[i*p[j]]=true;
            if(i%p[j]==0)
            {
                f[i*p[j]]=f[i]/(num[i]+1)*(num[i]+2);
                num[i*p[j]]=num[i]+1;
                break;
            }
            f[i*p[j]]=f[i*p[j]]*2;
            nunm[i*p[j]]=1;
        }
    }   
}

但求 1 − n 1-n 1n的约数和不需要筛

(只需要对 n i \frac{n}{i} in 求和)

其他积性函数类似

狄利雷卷积

( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f*g)(n)=\sum_{d|n}{f(d)g(\frac{n}{d})} (fg)(n)=dnf(d)g(dn)

性质:

  1. 交换律

    f ∗ g = g ∗ f f*g=g*f fg=gf

  2. 结合律

    ( f ∗ g ) ∗ h = f ∗ ( g ∗ h ) (f*g)*h=f*(g*h) (fg)h=f(gh)

  3. 分配律

    ( f + g ) ∗ h = f ∗ h + g ∗ h (f+g)*h=f*h+g*h (f+g)h=fh+gh

补充知识:

元函数 ϵ ( n ) = ( n = = 1 ) \epsilon(n)=(n==1) ϵ(n)=(n==1) 当且仅当 n = = 1 n==1 n==1 ϵ ( n ) = 1 \epsilon(n)=1 ϵ(n)=1

恒等函数 I ( n ) = 1 I(n)=1 I(n)=1

单位函数 i d ( n ) = n id(n)=n id(n)=n

性质:

  1. f ∗ ϵ = f f*\epsilon=f fϵ=f

  2. 积性函数*积性函数=积性函数 证明

  3. μ ∗ I = I ∗ μ = ϵ \mu*I=I*\mu=\epsilon μI=Iμ=ϵ

    ( ∑ d ∣ n μ ( d ) = ( n = = 1 ) \sum_{d|n}{\mu(d)}=(n==1) dnμ(d)=(n==1))

    非常重要

    (相当于二项展开)

  4. φ ∗ I = i d \varphi*I=id φI=id

    ( ∑ d ∣ n φ ( d ) = n \sum_{d|n}{\varphi(d)}=n dnφ(d)=n)

证明 ∑ d ∣ n μ ( d ) d = φ ( n ) n \sum_{d|n}{\frac{\mu(d)}{d}}=\frac{\varphi(n)}{n} dndμ(d)=nφ(n)

φ ∗ I = i d \varphi*I=id φI=id

i d ∗ μ = φ ∗ I ∗ μ = φ ∗ ( I ∗ μ ) = φ ∗ ϵ = φ id*\mu=\varphi*I*\mu=\varphi*(I*\mu)=\varphi*\epsilon=\varphi idμ=φIμ=φ(Iμ)=φϵ=φ

φ ( n ) = ∑ d ∣ n μ ( d ) i d ( n d ) = ∑ d ∣ n n d μ ( d ) \varphi(n)=\sum_{d|n}{\mu(d)id(\frac{n}{d})}=\sum_{d|n}{\frac{n}{d}\mu(d)} φ(n)=dnμ(d)id(dn)=dndnμ(d)

φ ( n ) n = ∑ d ∣ n μ ( d ) d \frac{\varphi(n)}{n}=\sum_{d|n}{\frac{\mu(d)}{d}} nφ(n)=dndμ(d)

莫比乌斯反演

F ( n ) 和 f ( n ) F(n)和f(n) F(n)f(n)均为定义在自然数上的函数,且满足

F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}{f(d)} F(n)=dnf(d)

f ( n ) = ∑ d ∣ n μ ( d ) F ( ⌊ n d ⌋ ) f(n)=\sum_{d|n}{\mu(d)F(\lfloor\frac{n}{d}\rfloor)} f(n)=dnμ(d)F(dn)

或者是:

f ( n ) = ∑ d ∣ n μ ( n d ) F ( d ) f(n)=\sum_{d|n}{\mu(\frac{n}{d})F(d)} f(n)=dnμ(dn)F(d)

这个定理就是莫比乌斯反演定理

证明:

F = f ∗ I F=f*I F=fI

F ∗ μ = f ∗ I ∗ μ = f ∗ ( I ∗ μ ) = f ∗ ϵ = f F*\mu=f*I*\mu=f*(I*\mu)=f*\epsilon=f Fμ=fIμ=f(Iμ)=fϵ=f

另外一种形式

更常用,因为找倍数比找因子要容易得多。

若:

F ( n ) = ∑ n ∣ d f ( d ) F(n)=\sum_{n|d}{f(d)} F(n)=ndf(d)

f ( n ) = ∑ n ∣ d μ ( d n ) F ( d ) = ∑ k ∈ N + μ ( k ) F ( k n ) f(n)=\sum_{n|d}{\mu(\frac{d}{n})F(d)}=\sum_{k\in N_+}{\mu(k)F(kn)} f(n)=ndμ(nd)F(d)=kN+μ(k)F(kn)

**注:**可以用容斥原理去理解。

杜教筛

整除分块

求解 ∑ i = 1 n ⌊ n i ⌋ \sum_{i=1}^{n}{\lfloor\frac{n}{i}\rfloor} i=1nin

其实可以发现有许多 ⌊ n i ⌋ \lfloor\frac{n}{i}\rfloor in都是一样的,因此可以把值相等的合成一个块,而且每一块最大值为 n ( n i ) \frac{n}{(\frac{n}{i})} (in)n

n / ( n / i ) n/(n/i) n/(n/i),换句话说一个块有个数为 l l l ,这个块的 ⌊ n i ⌋ \lfloor\frac{n}{i}\rfloor in 相等, 这个块最大的数就是 n ( n l ) \frac{n}{(\frac{n}{l})} (ln)n

不特别严谨证明

n / i n/i n/i 算出来一样,即 n = k × i + r n=k\times i+r n=k×i+r k k k一样

对于k一样的最大的 i i i,可得 r < k r<k r<k,否则 r ′ = r − k r^{'}=r-k r=rk使得 i + 1 i+1 i+1 也满足一样的 k k k

n k = i + r k = i \frac{n}{k}=i+\frac{r}{k}=i kn=i+kr=i

i m a x = n k = n n / i i_{max}=\frac{n}{k}=\frac{n}{n/i} imax=kn=n/in

for(l=1,r;l<=n;l=r+1)
{
 	r=n/(n/l);
    ans+=(r-l+1)*(n/l);
}//与每个l相同的值最大的为n/(n/l)

杜教筛

杜教筛就是为了计算 ∑ i = 1 n f ( i ) \sum_{i=1}^{n}{f(i)} i=1nf(i) ( f ( i ) f(i) f(i)为积性函数)

S ( n ) = ∑ i = 1 n f ( i ) S(n)=\sum_{i=1}^{n}{f(i)} S(n)=i=1nf(i)

为了出现 S ( n ) S(n) S(n),我们希望对 f f f求和

因此选取另一积性函数 g g g,并设 h = f ∗ g h=f*g h=fg注意 h h h也为积性函数

再计算 ∑ i = 1 n h ( i ) \sum_{i=1}^{n}{h(i)} i=1nh(i)

∑ i = 1 n h ( i ) = ∑ i = 1 n ∑ d ∣ i g ( d ) × f ( i d ) \sum_{i=1}^{n}{h(i)}=\sum_{i=1}^{n}\sum_{d|i}{g(d)\times f(\frac{i}{d})} i=1nh(i)=i=1ndig(d)×f(di)

= ∑ d = 1 n g ( d ) ∑ i = 1 ⌊ n d ⌋ f ( i ) =\sum_{d=1}^{n}{g(d)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}{f(i)} =d=1ng(d)i=1dnf(i)

= ∑ d = 1 n g ( d ) × S ( ⌊ n d ⌋ ) =\sum_{d=1}^{n}{g(d)}\times S(\lfloor\frac{n}{d}\rfloor) =d=1ng(d)×S(dn)

为了出现 S ( n ) S(n) S(n),提出第一项

∑ i = 1 n h ( i ) = g ( 1 ) × S ( n ) + ∑ d = 2 n g ( d ) × S ( ⌊ n d ⌋ ) \sum_{i=1}^{n}{h(i)}=g(1)\times S(n)+\sum_{d=2}^{n}{g(d)}\times S(\lfloor\frac{n}{d}\rfloor) i=1nh(i)=g(1)×S(n)+d=2ng(d)×S(dn)

g ( 1 ) × S ( n ) = ∑ i = 1 n h ( i ) − ∑ d = 2 n g ( d ) × S ( ⌊ n d ⌋ ) g(1)\times S(n)=\sum_{i=1}^{n}{h(i)}-\sum_{d=2}^{n}{g(d)}\times S(\lfloor\frac{n}{d}\rfloor) g(1)×S(n)=i=1nh(i)d=2ng(d)×S(dn)

通过构造 g g g,可得到 S ( n ) S(n) S(n)

应用

  1. S ( n ) = ∑ i = 1 n μ ( i ) S(n)=\sum_{i=1}^{n}{\mu(i)} S(n)=i=1nμ(i)

    通过式子 μ ∗ I = ϵ \mu*I=\epsilon μI=ϵ,可构造 g g g I I I(显然为积性函数), h h h ϵ \epsilon ϵ

    因此得到式子

    $ S(n)=1-\sum_{d=2}^{n} S(\lfloor\frac{n}{d}\rfloor)$

  2. S ( n ) = ∑ i = 1 n φ ( i ) S(n)=\sum_{i=1}^{n}{\varphi(i)} S(n)=i=1nφ(i)

    通过式子 φ ∗ I = i d \varphi*I=id φI=id,可构造 g g g I I I(显然为积性函数), h h h i d id id

    因此得到式子

    $ S(n)=\sum_{i=1}{n}{i}-\sum_{d=2}{n} S(\lfloor\frac{n}{d}\rfloor)$

∑ d = 2 n S ( ⌊ n d ⌋ ) \sum_{d=2}^{n} S(\lfloor\frac{n}{d}\rfloor) d=2nS(dn)要用到整除分块

  1. S ( n ) = ∑ i = 1 n i × φ ( i ) S(n)=\sum_{i=1}^{n}{i\times \varphi(i)} S(n)=i=1ni×φ(i)

    这个例子不太容易看出来,核心就是消去 i i i,

    可构造 g g g i d id id(会出现 n i \frac{n}{i} in,刚好可以消去),

    h = ∑ i ∣ n i × φ ( i ) × i d ( n i ) = ∑ i ∣ n i × φ ( i ) × n i = ∑ i ∣ n n × φ ( i ) = n × ∑ i ∣ n φ ( i ) = n 2 h=\sum_{i|n}{i\times \varphi(i)\times id(\frac{n}{i})}=\sum_{i|n}{i\times \varphi(i)\times \frac{n}{i}}=\sum_{i|n}{n\times \varphi(i)}=n\times \sum_{i|n}{\varphi(i)}=n^2 h=ini×φ(i)×id(in)=ini×φ(i)×in=inn×φ(i)=n×inφ(i)=n2

    因此得到式子

    $ S(n)=\sum_{i=1}{n}{i2}-\sum_{d=2}^{n}d\times S(\lfloor\frac{n}{d}\rfloor)$

∑ d = 2 n d × S ( ⌊ n d ⌋ ) \sum_{d=2}^{n}d\times S(\lfloor\frac{n}{d}\rfloor) d=2nd×S(dn)依然可以乘除分块

提醒

  • 至于在信息学中的代码实现,我给出一个大概的思路:我们首先先线筛出数据范围根号左右的积性函数的前缀和。再递归的实现杜教筛。
  • 特别要注意的是,杜教筛筛出的前缀和一定要存下来!!!
  • 如果你比较的勤劳,那就去手写hash,如果你想偷懒,那就最好用stl中的unordered_map,最好不要用map,平白无故多个log的复杂度,何必呢…
  • 还有一点,一定要记得取模!!!以及,判断要不要开long long,搞不好你TLE就是因为取模去多了,或者long long开多啦!
例子

模板题


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值