数论的小总结

来源:互联网 发布:curl php 编辑:程序博客网 时间:2024/05/18 02:56

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

拓展欧几里德算法


实现方式

对不完全为0的非负整数abgcd(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

逆元


口胡定义

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

求法

  1. 据费马小定理:
    假如p是质数,且gcd(a,p)=1ap互质,那么有ap11(modp)
    a×ap21(modp)
    所以amodp下的逆元为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)惑

中国剩余定理


原根


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

口胡定义

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

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

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

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

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

存在性

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

求解方法

通常最小的原根都比较小,所以最直接的方法:暴力枚举
假设枚举到g问是否为n的原根,即判断ϕ(n)是否为gn的阶。枚举ϕ(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卷积)
对两个算术函数fg,定义其狄利克雷卷积为新函数:

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

*把定义在正整数集的函数称为算术函数
其实就相当于定义新运算(?),将fg,表达为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. fg为积性函数,那么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,,pkn的所有质因数,nN

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

  1. 欧拉定理
    na皆为正整数,且na互质,则aφ(n)1(modn)
    可推出:当xy(modφ(n))时且an互质时,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进行约分。那么对于一个分母dd|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)

nk个不同的质因子,则公式等价与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互质的减掉即把与ngcdd的数减掉
dn是约数
所以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)
id换一下,即有

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]

交换枚举约数和倍数:idijdj
=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 更新内容:原根

0 0
原创粉丝点击