【模板】【笔记】数论各种姿势等等

数论的东西比较烦…最近脑子有点乱,学一点就赶紧记下来,以免忘了……

先贴个线性筛:

void shai()
{
    for(int i = 2,tot = 0;i <= n;i ++)
    {
        if(!vis[i]) pri[++ tot] = i;//当i是素数时
        for(int j = 1,m;j <= tot && (m = i * pri[j]) <= n;j ++)
        {
            vis[m] = 1;
            if(i % pri[j] == 0) { break; }//pri[j]是i的最小质因子时,若继续枚举素数,则枚举的素数将不是m的最小质因子。因为i中可以分解出更小的质因子,显然这个更小的质因子也是m的质因子。***此时m的最小质因子指数不为1***
            else ;//pri[j]不是i的一个因子时,pri[j]就是m的最小质因子。***此时m的最小质因子指数为1***
        }
    }

}

线性筛是 O(n) ,因为每个合数都被它的最小质因子筛去。

一、基本积性函数

1.欧拉函数( ϕ(n)

ϕ(n)=n(11pi)

当n是质数, ϕ(n)=n1
n=pi ,其中p是i的一个因数,则因为 ϕ(i)=i(11pi) ,所以 ϕ(n)=n(11pi)=pi(11pi)=pϕ(i)
n=pi ,p不是i的一个因数,则gcd(p,i)=1,所以根据积性函数得: ϕ(n)=ϕ(p)ϕ(i)

代码:

void shai()
{
    phi[1] = 1;
    for(int i = 2,tot = 0;i <= n;i ++)
    {
        if(!vis[i]) pri[++ tot] = i,phi[i] = i - 1;
        for(int j = 1,m;j <= tot && (m = i * pri[j]) <= n;j ++)
        {
            vis[m] = 1;
            if(i % pri[j] == 0) { phi[m] = phi[i] * pri[j]; break; }
            else { phi[m] = phi[i] * (pri[j] - 1);  }
        }
    }

}

2.莫比乌斯函数( μ(n)

定义:

μ(n)=10(1)rif n = 1if n 1n  r

所以:
当n是素数,显然 μ(n)=1
n=pi ,其中p是i的一个因数,显然 p2|n ,所以 μ(n)=0
n=pi ,其中p不是i的一个因数,因数个数改变了奇偶性,显然 μ(n)=μ(i)

代码:

void shai()
{
    mu[1] = 1;
    for(int i = 2,tot = 0;i <= n;i ++)
    {
        if(!vis[i]) pri[++ tot] = i,mu[i] = -1;
        for(int j = 1,m;j <= tot && (m = i * pri[j]) <= n;j ++)
        {
            vis[m] = 1;
            if(i % pri[j] == 0) { mu[m] = 0; break; }
            else { mu[m] = -mu[i];  }
        }
    }

}

3.约数个数( d(n)

d(n)=(ai+1) ai pi 的指数。
约数个数和分解后的指数的值密切相关,所以再记 cnt(n) 为n的最小质因数的指数。

当n是质数: d(n)=2 cnt(n)=1
n=pip2|i ,相当于p的指数增加了1, cnt(n)=cnt(i)+1 。因为 d(n)=(ai+1) ,所以 d(n)=d(i)cnt(i)+1(cnt(n)+1)
n=pi ,p不是i的因数,此时p的 ai 为1,因为 d(n)=(ai+1) ,所以 d(n)=d(i)2 cnt(n)=1

代码:

void shai()
{
    d[1] = 1;
    for(int i = 2,tot = 0;i <= n;i ++)
    {
        if(!vis[i]) pri[++ tot] = i,d[i] = 2,cnt[i] = 1;
        for(int j = 1,m;j <= tot && (m = i * pri[j]) <= n;j ++)
        {
            vis[m] = 1;
            if(i % pri[j] == 0) { cnt[m] = cnt[i] + 1; d[m] = d[i]/(cnt[i] + 1) * (cnt[m] + 1); break; }
            else { cnt[m] = 1; d[m] = d[i] << 1;  }
        }
    }

}

还有一些积性函数,比如:

4.常函数1( 1

就是1。

5.id(id(i)

id(i)=i

6.e( e(i)

e(i)={10if i = 1 otherwise 


二、莫比乌斯反演/狄利克雷积

狄利克雷积:

f(n)g(n) 都是积性函数。

(fg)(n)=f(n)g(n)

(f×g)(n)=d|nf(d)g(nd)

fgf×g 都是积性函数。

n=d|nϕ(d)

e(n)=d|nμ(d)

可以写成

id=ϕ×1

e=μ×1

莫比乌斯反演:

f(n)=d|nF(d) ,则

F(n)=d|nμ(d)f(nd)

可以各种简化运算和转化问题…

三、一些公式的推导

i<=ngcd(i,n)

=i<=nd|i d|nϕ(d)

=d|nϕ(d)nd


i<=nj<=mgcd(i,j)

=i<=nj<=md|i d|jϕ(d)

=d<=min(n,m)ϕ(d)ndmd


f(n)=1n f(n)=d|nF(d) ,那么 F(n)=d|nμ(d)f(nd)

i<=nlcm(i,n)

=ni<=nif(gcd(i,n))

=ni<=nid|i d|nF(d)

=nd|nF(d)i<=ni[d|i]

=nd|nF(d)di<=n/di

=nd|nF(d)n(n/d+1)2

=n22(F×1+F×id)


i<=nj<=mlcm(i,j)

=i<=nj<=mijf(gcd(i,j))

=i<=nj<=mijd|i d|jF(d)

=d<=min(n,m)F(d)i<=nj<=mij[d|i d|j]

=d<=min(n,m)F(d)ddSUM(nd,md)


i<=ni[gcd(i,n)=1]

=i<=nie(gcd(i,n))

=i<=nid|i d|nμ(d)

=d|nμ(d)i<=ni[d|i]

=n2(d|nμ(d)nd+d|nμ(d))

=n2(ϕ+e)


奇怪的小技巧

筛积性函数注意推 f(pk)
二维问题先思考一维情况。

参考资料:《数论函数变换》——kAc

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值