数论的小总结

有什么呢..其实我也不知道什么算是数论都丢上来好了
我决定把目录删掉..这样不会太早暴露智商...
[update.它居然自动帮我加了个目录

拓展欧几里德算法


实现方式

对不完全为0的非负整数 a b gcd(a,b) 必有整数对 (x,y) 使 ax+by=gcd(a,b) 成立。
- 显然,当 b=0 时, gcd(a,b)=a 。此时有 x=1,y=0 .
- 据欧几里德原理有 gcd(a,b)=gcd(b,amodb)
又有

{ax+by=gcd(a,b)bx+(amodb)y=gcd(b,amodb)

ax+by=bx+(amodb)y
=bx+(aabb)y
=ay+b(xaby)
x=yy=xaby

于是就可以递归求解了
代码如下:

void exgcd(int a,int b,int &d,int &x,int &y)
{
    if (b==0)
    {
        x=1,y=0;d=a;
        return;
    }
    exgcd(b,a%b,d,x,y);
    int t=x;x=y,y=t-a/b*y;
}

应用

一、解不定方程
求解形如 Ax+By=c 的不定方程
首先,若 C 能被 gcd(a,b) 整除,则方程存在整数解,否则不存在。
证明:
∵必有一组 (x0,y0) 满足 Ax0+By0=gcd(A,B)
令式子两端同乘 Cgcd(A,B) 即可得一组满足的解 (x0Cgcd(A,B),y0Cgcd(A,B))
∴设 x1=x0Cgcd(A,B) y1=y0Cgcd(A,B) ,有 Ax1+By1=C
而得整数解的前提就是 C 能被 gcd(a,b) 整除啊。

Ax+By=C 的其他整数解满足:

A(x1+Bgcd(A,B)×t)+B(y1Agcd(A,B)×t)=C,tZ

于是即可由一组解 (x1,y1) 得到该方程组的所有整数解
p=Bgcd(A,B) ,该方程的最小整数解为 x=(x1modp+p)modp.

二、解模线性方程组
同余方程 axb(modn) 对未知数 x 有解当且仅当 gcd(a,n)b 且有解时有 gcd(a,n) 个解。即若 gcd(a,n)=1 是方程有唯一解。

axb(modn)ax+ny=b

然后就转成应用1了

三、求模下的逆元
a 在模 n 下的逆元,保证 gcd(a,n)=1 ,即求 ax1(modn) 中的 x
然后就转成应用2了[:那你为什么要单独列[掀桌

题目

bzoj1407 Savage

逆元


口胡定义

a modp 下的逆元即使该式 a×b=1(modp) 成立的 b
通常写成 a1

求法

  1. 据费马小定理:
    假如 p 是质数,且 gcd(a,p)=1 a p 互质,那么有 ap11(modp)
    a×ap21(modp)
    所以 a modp 下的逆元为 ap2 ,这个可以快速幂求得。
    注意条件哦。
  2. 应用拓展欧几里德求解方程(展开就懒得打了)
  3. 线性求逆元
    前提: p 为质数
    a1=(ppa)×(pmoda)1modp
    证明:
    k=pa,r=pmoda ,有 p=ka+r
    ka+r0(modp)
    (ka+r)a1r10(modp)
    (k+a1r)r10(modp)
    kr1+a10(modp)
    ∴(拆开) a1=pa(pmoda)1(modp)
    a1=(ppa)×(pmoda)1modp
ny[1]=1;for (i=2;i<=lim;i++) ny[i]=(LL)(p-(p/i))%p*(LL)ny[p%i]%p;

题目

bzoj2186[SDOI2008]萨拉公主的困(you)惑

中国剩余定理


原根


引入一个东西,
定义,设 a n 是互质的整数, an n0 .使得 ax1(modn) 成立的最小正整数 x 称为 a n 的阶,并即为 ordna .
据欧拉定理,若 gcd(a,n)=1,nZ+ ,有 aϕ(n)1(modn)
那么就会有 ordnaϕ(n)

口胡定义

一个正整数 x ,若其所有幂次遍历模 n 的所有整数,那么它就是模 n 的一个原根。
定义,如果 r n 是互质的整数且 n0 ,那么当 ordnr=ϕ(n) 时,称 r n 的原根或者n的原根,并且我们称 n 有一原根。

性质(?反正是一些相关的定理或者推论吧)

  1. g 是模 n 的一个原根, g n 互质且 n0 ,那么 g1,g2,,gϕ(n) 构成模 n 的既约剩余系。即有 gimodn 1iϕ(n) 的结果互不相同。

    既约剩余系[来自度娘
    在模n的值与n互质的全部剩余类中,从每一类中各任取一数所组成的数的集合,叫做模n的一个简化剩余系,也叫缩系。也可以理解为,在每个剩余类选取至1个与m互素代表元构成简化剩余系。
    模n的简化剩余系中元素的个数为φ(n)(既欧拉函数)

  2. r n 的原根, n1 nZ ,那么 ru n 的一个原根当且仅当 (u,ϕ(n))=1 .
    于是得到如下定理,如果正整数 n 有一个原根,那么他一共有 ϕ(ϕ(n)) 个不同余的原根

存在性

并非所有整数都有原根,例如没有模8的原根。
一个正整数有原根当且仅当它为2,4, pt 2pt ,其中 p 为奇素数且 t 的正整数。
证明就不打了。。好长啊。。整整一节。。

求解方法

通常最小的原根都比较小,所以最直接的方法:暴力枚举
假设枚举到 g 问是否为 n 的原根,即判断 ϕ(n) 是否为 g n 的阶。枚举 ϕ(n) 的约数 p ,若有 gp1(modn) ,那么 g 就不是 n 的原根。因为与 gi 不同余矛盾,冲突。
但是这样会做了很多重复的东西。
其实只要枚举 ϕ(n) 的质因数 pi ,只需要检验 gϕ(n)/p1,gϕ(n)/p2,...,gϕ(n)/pm 这m个数中,是否存在一个数mod n 为1,存在就不是,就好了。

模板题目

51Nod1135原根问题

积性函数


口胡定义

若函数 f(x) 是积性函数,则有:对互质的两个数 a,b ,有 f(ab)=f(a)f(b)
而完全积性函数是对任意 a,b 都有 f(ab)=f(a)f(b)

先说下这个:
狄利克雷卷积( Dirichlet 卷积)
对两个算术函数 f g ,定义其狄利克雷卷积为新函数:

(fg)(n)=d|nf(d)g(nd)

*把定义在正整数集的函数称为算术函数
其实就相当于定义新运算(?),将 f g ,表达为 fg
性质:
交换律: fh=gf
结合律: (fg)h=f(gh)
单位元: fϵ=f
对逐点加法的分配律: f(g+h)=fg+fh

性质

  1. n=pa11pa22pakk ( p 为质数),有 f(n)=f(pa11)f(pa22)f(pakk)
  2. f 为积性函数且有 f(pn)=fn(p) ,那么 f 为完全积性函数。
  3. f g 为积性函数,那么 fg 也为积性函数(就是指狄利克雷卷积)。
  4. 积性函数的前缀和也是积性函数。
  5. 对于 f(n)=d|ng(d) ,只要有一者积性,两者都积性。

常见的积性函数(必记)

  • Id(n) ——单位函数,也有作 u(n) 。定义 Id(n)=n
  • Idk(n) ——单位幂函数,定义 Idk(n)=nk
  • φ(n) ——欧拉函数
  • μ(n) ——莫比乌斯函数
  • ϵ(n) ——当且仅当 n=1 时, ϵ(n)=1 ;否则 ϵ(n)=0
  • d(n) —— n 的约数个数
  • σ(n) —— n 的约数之和

常用的公式

  • 1μ=ϵ 1 是恒等函数恒等于1.
  • 1φ=Id
  • (Idφ)Id=Id2

重点的展开

一、欧拉函数
φ(n) 为小于等于 n 的正整数中与 n 互质的个数
通式 φ(n)=n(11p1)(11p2)(11pk)
其中 p1,p2,,pk n 的所有质因数, nN

若有质数 P ,有 φ(pk)=(p1)pk1
φ(pk)=pkpk1 得到。因为除了 p 的倍数其他都与 pk 互质。

  1. 欧拉定理
    n a 皆为正整数,且 n a 互质,则 aφ(n)1(modn)
    可推出:当 xy(modφ(n)) 时且 a n 互质时, axay(modn)
  2. axaxmodφ(n)+φ(n)(modn) xφ(n) 。[不要求 a , n 互质]

1φ=Id 的证明:

1φ=d|nμ(d)1(nd)=d|nφ(d)

对以 n 为分母的所有真分数: 0n , 1n , 2n , n1n 进行约分。那么对于一个分母 d d|n ,且以 d 为分母的份数个数恰为 φ(d) 个。
所以有 d|nφ(d)=n
1φ=Id

二、莫比乌斯函数

μ(n)=0npp2|n1n1n

性质
1.
d|nμ(d)={1n=10n>1,nN

2. d|nμ(d)d=φ(n)n


1μ=ϵ 的证明:

1μ=d|nμ(d)1(nd)=d|nμ(d)

n k 个不同的质因子,则公式等价与 kx=0Cxk(1)x .
μ(n) 的定义意会一下(…..),通过容斥来考虑,可知(- -)当 k0 时,使该值为0.
n1 时, 1μ=0
所以 1μ=ϵ

线性筛


就是一种筛法,时间复杂度是 O(n) 。因为每个数只会被筛到一次,被其最小质因子筛到。
线性筛也通常作为一种工具(?)来在线性的时间内求出一个函数的值。
对于一个想要被线筛搞出来的函数 f ,要考虑三种情况:
1、 x 是质数时, f(x) 的取值
2、 xi 时, f(xi) f(x) f(i) 的关系
3、 xi 时, f(xi) f(x) f(i) 的关系
如果都能找得到就可以用线性筛来求辣,不一定非要是积性函数。
要注意给 f[1] 赋值
下面含有 μ φ 的线筛打法,代码:

void pre()
{
    cnt=0;mu[1]=1;phi[1]=1;
    for (LL i=2;i<=lim;i++)
    {
        if (!ispri[i]) {pri[++cnt]=i;mu[i]=-1;phi[i]=i-1;}
        for (LL j=1;j<=cnt && i*pri[j]<=lim;j++)
        {
            ispri[i*pri[j]]=true;
            if (i%pri[j]==0)
            {
                mu[i*pri[j]]=0;
                phi[i*pri[j]]=phi[i]*pri[j];
                break;
            }
            mu[i*pri[j]]=-mu[i];
            phi[i*pri[j]]=(pri[j]-1)*phi[i];
        }
    }
    //for (LL i=2;i<=lim;i++) phi[i]+=phi[i-1],mu[i]+=mu[i-1];
}

题目(有关积性函数跟线性筛的)

bzoj2705[SDOI2012] Longge的问题
bzoj2440 [中山市选2011]完全平方数
bzoj2005 [Noi2010]能量采集
bzoj2226[Spoj 5971] LCMSum
bzoj2818 Gcd
bzoj3529 数表
bzoj2749 [HAOI2012]外星人

莫比乌斯反演


f 为积性函数,且 g(n)=d|nf(d) ,那么 g 也是积性函数。
且有

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

证明:
g(n)=d|nf(d) ,即 g=f1
又有 1μ=ϵ
f=gμ
f(n)=d|nμ(d)g(nd)

题目

bzoj2301 [HAOI2011]Problem b
bzoj2154 Crash的数字表格
bzoj2818 Gcd (两种做法)
bzoj2693 jzptab
bzoj3309 DZY Loves Math
bzoj3994 [SDOI2015]约数个数和
bzoj4407 于神之怒加强版

杜教筛


这是个低于线性时间的复杂度下解决一类积性函数的前缀和的筛法(?)。
嗯..我只学会了搞 φ μ 的前缀和..
假装会了..

φ(d) 的前缀和

定义 ϕ(n)=ni=1φ(i) ,即欧拉函数的前缀和。
据公式 1φ=u ,即 d|nφ(d)=n
移项一下就变成了 φ(n)=nd|n,d<nφ(d)

如果是直接理解为什么 d|n,d<nφ(d) 表示小于等于 n 且不与 n 互质的数的个数的话
那么就将它写成 d|n,d<nφ(nd) .
把小于等于 nd 且与 nd 互质的减掉即把与 n gcd d 的数减掉
d n 是约数
所以 d|n,d<nφ(d) 就表示小于等于 n 且不与 n 互质的数了啊

于是

ϕ(n)=i=1n(id|i,d<iφ(d))

i 提出来就是
n(n+1)2i=1nd|i,d<iφ(d)

n(n+1)2id=2nd=1nidφ(d)

换一下元, id>i
n(n+1)2i=2nd=1niφ(d)

于是后面那块也变成了前缀和
n(n+1)2i=2nϕ(ni)

综上,即有
ϕ(n)=n(n+1)2i=2nϕ(ni)

μ(d) 的前缀和

定义 M(n)=ni=1μ(i)
同样的从公式入手,有 1μ=ϵ ,即 d|n1×μ(d)=[n=1]
反演一下,即 1=ni=1[i=1]=ni=1d|iμ(d)
这个实即 nd=1nd×μ(d)
i[1,nd]
所以就有 nd=1ndi=1μ(d)
i d 换一下,即有

1=d=1ni=1ndμ(d)

后面那个就是莫比乌斯的前缀和,改成 M(nd)
M(n)=ni=1M(ni)ni=2M(ni)
所以有
M(n)=1i=2nM(ni)

题目

51Nod1239
51Nod1244
bzoj3944 Sum
bzoj3512 DZY Loves Math IV
bzoj3930 [CQOI2015]选数

常用套路 怎么全是套路![掀桌.jpg


常见的解题步骤

  1. 根据题意列出式子
  2. 画柿子,直到画出自己想要的或者说能在时间内求得的
  3. 通常要预处理某个函数的前缀和,考虑暴力 O(nlogn) 、线性筛 O(n) 、杜教筛 O(n23) (听说的..)。。如果都不行。。我也不会了。。
  4. 最后通常都要分块 O(n) ,利用之前预处理的函数前缀和或求和公式来处理。

等价变化的套路

  1. 枚举最小公约数;
  2. 内外层求和对调,通常是交换枚举倍数和约数;
  3. 有意识得化成 gcd=1 这样的的式子利用莫比乌斯反演;
  4. 有时候想着直接反演之前考虑一下欧拉函数,可能欧拉化的更简单;
  5. 换元,比如 nd=1ndt=1XXndtX 这种时候,通常设 D=dt 来进行换元;
  6. 要多想想式子的实际意义,可以通常意义来等价变化
  7. 把能提的先提出来

一些公式推导的栗子

1、原式:

i=1nj=1m[gcd(i,j)=d]

=d=1min(n,m)id=1njd=1m[gcd(id,jd)=1]

交换枚举约数和倍数: idi jdj
=d=1min(n,m)i=1ndj=1mdϵ(gcd(i,j))

∵有 1μ=ϵ ,即 d|nμ(d)=ϵ(n)
所以有:
=i=1nj=1md|(i,j)μ(d)

=i=1nj=1md|i,d|jμ(d)

=d=1min(n,m)μ(d)×id×jd

2、原式:

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

=i=1nj=1md|(i,j)φ(d)

=d=1min(n,m)φ(d)×nd×md

诶懒得复制了。。去做题吧。。推导在题解里都有。。

感想= =

  1. 感觉套路很深,像是定义几个函数(能预处理的)来套用化简,或者说是把化得的某串东西当成一个函数来求 之类的,这样的我都不会。怎么说,就是碰到了没有一点感觉。
  2. 对什么时候能直接暴力做还是要继续化简没有准确的预估。
  3. 画柿子画到不会画了但是又求不出来的时候..看了一眼题解..woc怎么这么套路
  4. 熟练应用各种性质是很重要的[但是我做不到啊QAQ]

学习资料


浅谈一类积性函数的前缀和 - skywalkert
积性函数、线性筛、莫比乌斯反演和一堆乱七八糟的题目 - jcvb
莫比乌斯反演个人小结 - femsub
初等数论及其应用(原书第六版) (美)Kenneth H.Rosen 著 夏鸿刚 译

附言


  • 题目不一定按难易程度排,而且只是bo主自己做了的
  • 写在上面的题目一般都写了题解
  • bo主语文不好脑子也不好使,可能全在口胡
  • bo主从来只有被套路,因为自己不会套路QAQ
  • 为什么看起来写了很多但是都没有什么很厉害的东西QAQ
  • 算了就这样吧,欢迎指错..




在愚人的一天,愚了自己。

愚人节快乐!


更新辣因为还有好多不会的
——2017.4.12

2017/04/15 更新内容:原根

你可能感兴趣的:(数论,带题表或总结的??)