数论

质数

唯一分解定理

任意一个正整数都可以唯一地表示成若干个素数的乘积,其中素数因子从小到大依次出现(这里的“乘积”可以有0个、1个或多个素因子)。

埃氏筛

要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。时间复杂度O(nlogn)

  a[1]=1;
  for(int i=2;i*i<=n;i++)
  {
    if(!a[i])
      for(int j=i*i;j<=n;j+=i) a[j]=1;
  }

时间复杂度分析

1、

埃筛看上去有两重循环,看着好像是O(n2)

但是分析每层循环,发现循环次数为

n1+n2+n3+...+nn

=n(1+12+13+...+1n)

发现括号内出现调和级数,对此有以下结论:

i=1n1nlog2n

因此有时间复杂度O(nlogn)

2、

实际上,标准的埃筛时间复杂度为O(nloglogn)

区别在于有无中间的 if(!a[i])

运用

埃筛常用于对因数(倍数)的筛查和统计,在数据大小支持且无法莫比乌斯反演的情况下使用

例:

P7960 [NOIP2021] 报数

P7517 [省选联考 2021 B 卷] 数对

70分做法:i=1maxaj|icnt[i]cnt[j]

变化一下,第二维枚举倍数:i=1maxai|jmaxacnt[i]cnt[j]

发现符合埃筛形式,用埃筛统计即可

线性筛

在埃氏筛中,每个数被筛若干次。

改进:使每个数只被最小质因子筛。

当循环到当前数的因子之后,即可跳出循环。

时间复杂度O(n)。

  vis[0]=vis[1]=1;
  for(int i=2;i<=n;i++) {
    if(!vis[i]) p[++cnt]=i;	//p[]记录素数
    for(int j=1;j<=cnt&&i*p[j]<=n;j++) {
      vis[i*p[j]]=1;		//i*p[j]被p[j]筛掉
      if(i%p[j]==0) break;	//p[j]循环到i的最小质因数则退出,因为i*p[j]只能被
    }				//最小质因数筛去,也就是i的最小质因数
  }

新的理解

线性筛中各种操作,相当于对当前数的分类讨论:

1、i是质数;

!vis[i],存入p[]

2、ip[j]中,p[j]i的最小质因子;

i,p[]循环边界

3、ip[j]中,p[j]不是i的最小质因子;

正常筛数

这三类数在线性筛求各种积性函数的分析中起重要作用;

p.s.有时候需要记录最小质因子的个数;

最大公因数 & 最小公倍数

最大公因数:gcd(a,b), 亦作 (a,b)

最小公倍数:lcm(a,b), 亦作 [a,b]

性质

1、gcd(a,b)=gcd(b,amodb)

应用:辗转相除法求gcd,时间复杂度O(logn)

2、a×b=gcd(a,b)×lcm(a,b)

3、gcd(a,b)=gcd(b,ab)=gcd(a,ab)

证明:设gcd(a,b)=k,则a=ka,b=kb,且gcd(a,b)=1

gcd(a,b)=kgcd(a,b)

gcd(b,ab)=kgcd(b,ab)

则问题等价于证明gcd(b,ab)=gcd(a,b)=1

反证,设gcd(b,ab)=p (p1),则有b=pb,ab=p(ab),则a=pa,则gcd(a,b)=p,与条件矛盾,故得证

同理,第二个等号也可得出

利用此结论可以进一步证明性质1,当然还有其他用途

解题经验

多个数求gcd常用质因数分解。

例1:给定n个数,从其中选n-1个数,问最大gcd。(n <= 10^5)

解:任选两个数,答案一定在其因子里(抽屉原理)。检验答案即可。

例2:[P5502]
给定一个长度为 N 的正整数序列 Ai

定义权值为 W(L,R)=(RL+1)×gcd(Al,...,Ar)

求出最大权值。

1Ai1012,1N100000

解法1:cdq分治板子

解法2:考虑定住右端点时,区间[1l,r]gcd值最多会有O(logV)种(V为值域)(因为根据唯一分解,区间gcdV在区间扩大时要么不变,要么至少缩小2倍),每次移动右端点时将这O(logV)个值暴力修改就行了

例3: 求ni=1gcd(i,k)

题目链接

解:先对k因数分解,最多会有O(k)的因数,再考虑这些因数的贡献,因数i的贡献可用n/i快速求出,但对于小的因数,它们的倍数也为因数时会算重,因此从大到小考虑,把大数中算重的小数容斥掉即可,时间复杂度最坏约为O(n12+n23),但是卡不满

约数个数有关的公式,见link

例4:求lcm(a1,a2,...,an)

同余运算

基本性质

裴(péi)蜀定理

a,b是不全为零的整数,则存在整数x,y,使得ax+by=gcd(a,b)

推论

a,b互质的充要条件是存在x,y使得ax+by=1

拓展欧几里得算法

线性不定方程

ax+by=c。给出整数 a,b,c,求出一组整数解。

推导

gcd(a,b)=d

则若原方程有解,c 必为 gcd(a,b) 的倍数(可用裴蜀定理推论证明)。

d=gcd(a,b)=gcd(b,amodb),则有不定方程d=bx+(amodb)y

  变形为:d=bx+(amodb)y

=bx+(a(a÷b)b)y

=bx+ay(a÷b)by

=ay+b(x(a÷b)y)

又由于d=ax+by,则有两个等式:x=yy=x(a÷b)y

对子问题(求解bx+(amodb)y=d)进行递归直至bn=0,此时an=gcd(a,b),方程只剩anxn=d,可得此时xn=1,yn=0yn是随便赋值),回溯迭代求出x,y即可

代码

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

时间复杂度 O(logn)

细节处理

对于b0,扩欧求出的解x,y必有|x|b,|y|a

应用

例1:[P1082]求关于x的同余方程 ax1(mod b) 的最小正整数解。

欧拉函数

定义

正整数n的欧拉函数φ(n)的值等于不超过n且与n互质的正整数的个数。

性质



性质5: 如果p为质数,且i % p = 0,则 φ(i * p) = p * φ(i)

性质5可以用来线性求欧拉函数(欧拉筛)

代码

费马小定理

定义

假如p是质数,且gcd(a,p)=1,那么 a(p1)1(mod p)

解释: 假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1

apa(mod p)

欧拉定理

定义

若m,a为正整数,且gcd(a,m)=1,则aφ(m)1(mod m)

乘法逆元

扩欧求逆元

线性求逆元

中国剩余定理

求解

{xb1 (mod m1)xb2 (mod m2)...xbn (mod mn)

x的最小正整数解,mi两两互质

建议直接背公式

M=i=1nmi

Mi=Mmi

ans=i=1nbiMiMi(modmi)1(modM)

扩展中国剩余定理

这位大佬讲得很透彻


数论分块

高效求解i=1nf(i)ni,若f(lr)可以在O(1)的时间内求出,则可以在O(n)的时间内计算该式的值

简单来说,把ni相同的值一起统计即可

正确性证明

1、ni的值是O(n)

in时,ni最多n种取值

i>n时,ni<nni最多n种取值

细节处理

注意nni 有可能会超过n,注意特判

例题

P2261 [CQOI2007]余数求和

原根与阶

利用群论知识,可以更好理解(其实是一套东西)

定义

阶:对于整数(a,m)=1,满足ak1 (mod m)的最小整数kam的阶,记作δm(a)

原根:当δm(a)=φ(m)时,a为关于m的原根

性质

1、由欧拉定理,δm(a)φ(m)

2、1δm(a)构成剩余系,a1aδm(a)互不同余,δm(a)为最小循环节

3、阶的运算:

δm(ab)=δm(a)δm(b)的充要条件为(δm(a),δm(b))=1

δm(at)=δm(a)gcd(δm(a),t)

证明略

4、对于原根gg1,g2,...,gφ(m)构成既约剩余系

5、如果m有原根,那么mφ(φ(m))个原根

6、由循环群的性质,m的原根一定在g1,g2,...,gφ(m)之中

原根存在定理

一个数存在原根当且仅当m=2,4,pα,2pα,其中p为奇素数,α为正整数

原根判定定理

gm的一个原根的充要条件为:对于φ(m)的每一个质因数p,都有gφ(m)p1 (mod m)

推论

gm的一个原根,则S={gs|1sφ(m),sφ(m)}

证明:(待补充link

求原根

1、判断是否有原根,用原根存在定理判断

2、找最小原根g,已知最小原根大小不超过m0.25,暴力枚举,用原根判定定理判断

3、求g1φ(m)次方,gssφ(m)为原根,找出φ(φ(m))个即可

时间复杂度为O(m0.25logm+φ(m)logφ(m))

p.s. 998244353的最小原根是3

BSGS

求解axb(modp)ap互质

原理:根号平衡

x=ipj,则有1i,jp

原式化为:aipjb(modp)

aipbaj(modp)

baj扔进map里,在遍历aip时Check就行了

时间复杂度O(plogp)

拓展BSGS

即不一定满足a,p互质

考虑变形:ax+kp=b

ax1a+kp=b

由裴蜀定理,将ax1看作a的系数,则该方程有解的充要条件是gcd(a,p)b

d=gcd(a,p),则ax1ad+kpd=bd

然后将ax1,pd,bd作为新的ax,p,b 处理

反复进行该操作,直至gcd(a,p)=1

最后把相应系数乘上即可

施工中...

posted @   Zhone_lb  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示