数论

质数

唯一分解定理

任意一个正整数都可以唯一地表示成若干个素数的乘积,其中素数因子从小到大依次出现(这里的“乘积”可以有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(n^2)\)

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

\[\frac{n}{1}+\frac{n}{2}+\frac{n}{3}+...+\frac{n}{n} \]

\[=n(1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n}) \]

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

\[\sum^n_{i=1}\frac{1}{n}\approx \log_2n \]

因此有时间复杂度\(O(n\log n)\)

2、

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

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

运用

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

例:

P7960 [NOIP2021] 报数

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

70分做法:\(\displaystyle\sum^{maxa}_{i=1}\sum_{j|i}cnt[i]*cnt[j]\)

变化一下,第二维枚举倍数:\(\displaystyle\sum^{maxa}_{i=1}\sum^{maxa}_{i|j}cnt[i]*cnt[j]\)

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

线性筛\(\color{red} {^*}\)

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

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

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

时间复杂度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、\(i*p[j]\)中,\(p[j]\)\(i\)的最小质因子;

\(i%p[j]==0\),p[]循环边界

3、\(i*p[j]\)中,\(p[j]\)不是\(i\)的最小质因子;

正常筛数

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

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

最大公因数 & 最小公倍数

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

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

性质

1、\(\gcd(a,b)=\gcd(b,a\!\!\mod b)\)

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

2、\(a \times b=\gcd(a,b) \times lcm(a,b)\)

3、\(\gcd(a,b)=\gcd(b,a-b)=\gcd(a,a-b)\)

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

\(\gcd(a,b)=k\cdot\gcd(a',b')\)

\(\gcd(b,a-b)=k\cdot\gcd(b',a'-b')\)

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

反证,设\(\gcd(b',a'-b')=p\ (p\not=1)\),则有\(b'=pb'',a'-b'=p(a''-b'')\),则\(a'=pa''\),则\(\gcd(a',b')=p\),与条件矛盾,故得证

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

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

解题经验

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

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

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

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

定义权值为 \(W(L,R) = (R-L+1) × \gcd (A_l,...,A_r)\)

求出最大权值。

\(1 \le A_i \le 10^{12}, 1 \le N \le 100000\)

解法1:cdq分治板子

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

例3: 求\(\displaystyle\sum^{i=1}_n gcd(i,k)\)

题目链接

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

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

例4:求\(lcm(a_1,a_2,...,a_n)\)

同余运算

基本性质

裴(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,a\bmod b)\),则有不定方程\(d=bx'+(a\bmod b)y'\)

  变形为:\(d=bx'+(a\bmod b)y'\)

\(\hspace{1.45cm}=bx'+(a-(a \div b)*b)*y'\)

\(\hspace{1.45cm}=bx'+ay'-(a \div b)*b*y'\)

\(\hspace{1.45cm}=ay'+b*(x'-(a \div b)*y')\)

又由于\(d=ax+by\),则有两个等式:\(x=y'\);$ y=x'-(a \div b)*y'$。

对子问题(求解\(bx'+(a\bmod b)y'=d\))进行递归直至\(b_n=0\),此时\(a_n=gcd(a,b)\),方程只剩\(a_nx_n=d\),可得此时\(x_n=1,y_n=0\)\(y_n\)是随便赋值),回溯迭代求出\(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(\log n)\)

细节处理

对于\(b \not = 0\),扩欧求出的解\(x,y\)必有\(|x| \le b,|y| \le a\)

应用

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

欧拉函数

定义

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

性质



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

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

代码

费马小定理

定义

假如p是质数,且gcd(a,p)=1,那么 \(a^{(p-1)} ≡1(\bmod\ p)\)

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

\(a^p≡a(\bmod\ p)\)

欧拉定理

定义

若m,a为正整数,且\(\gcd(a,m) = 1\),则\(a^{φ(m)}≡1 (\bmod\ m)\)

乘法逆元

扩欧求逆元

线性求逆元

中国剩余定理

求解

\[\begin{cases} x \equiv b_1\ ({\rm mod}\ m_1) \\ x\equiv b_2\ ({\rm mod}\ m_2) \\ ... \\ x \equiv b_n\ ({\rm mod}\ m_n)\end{cases} \]

\(x\)的最小正整数解,\(m_i\)两两互质

建议直接背公式

\[M=\prod_{i=1}^nm_i \]

\[M_i=\frac M {m_i} \]

\[ans=\sum_{i=1}^nb_iM_iM_{i \pmod {m_i}}^{-1}\pmod M \]

扩展中国剩余定理

这位大佬讲得很透彻


数论分块

高效求解\(\displaystyle \sum_{i=1}^nf(i)\cdot \lfloor\frac n i\rfloor\),若\(\sum f(l\sim r)\)可以在\(O(1)\)的时间内求出,则可以在\(O(\sqrt n)\)的时间内计算该式的值

简单来说,把\(\displaystyle \lfloor\frac n i\rfloor\)相同的值一起统计即可

正确性证明

1、\(\displaystyle\lfloor \frac n i\rfloor\)的值是\(O(\sqrt n)\)

\(i\le\sqrt n\)时,\(\displaystyle\lfloor \frac n i\rfloor\)最多\(\sqrt n\)种取值

\(i>\sqrt n\)时,\(\displaystyle\lfloor \frac n i\rfloor<\sqrt n\)\(\displaystyle\lfloor \frac n i\rfloor\)最多\(\sqrt n\)种取值

细节处理

注意\(\displaystyle\lfloor \frac{n}{\lfloor \frac{n}{i} \rfloor} \rfloor\) 有可能会超过\(n\),注意特判

例题

P2261 [CQOI2007]余数求和

原根与阶

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

定义

阶:对于整数\((a,m)=1\),满足\(a^k\equiv1\ (\bmod\ m)\)的最小整数\(k\)\(a\)\(m\)的阶,记作\(\delta_m(a)\)

原根:当\(\delta_m(a)=\varphi(m)\)时,\(a\)为关于\(m\)的原根

性质

1、由欧拉定理,\(\delta_m(a)\mid\varphi(m)\)

2、\(1\thicksim\delta_m(a)\)构成剩余系,\(a^1\thicksim a^{\delta_m(a)}\)互不同余,\(\delta_m(a)\)为最小循环节

3、阶的运算:

\(\delta_m(ab)=\delta_m(a)\delta_m(b)\)的充要条件为\((\delta_m(a),\delta_m(b))=1\)

\(\displaystyle\delta_m(a^t)=\frac{\delta_m(a)}{\gcd(\delta_m(a),t)}\)

证明略

4、对于原根\(g\)\(g^1,g^2,...,g^{\varphi(m)}\)构成既约剩余系

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

6、由循环群的性质,\(m\)的原根一定在\(g^1,g^2,...,g^{\varphi(m)}\)之中

原根存在定理

一个数存在原根当且仅当\(m=2,4,p^{\alpha},2p^\alpha\),其中\(p\)为奇素数,\(\alpha\)为正整数

原根判定定理

\(g\)\(m\)的一个原根的充要条件为:对于\(\varphi(m)\)的每一个质因数\(p\),都有\(\displaystyle g^\frac{\varphi(m)}{p} \not\equiv 1\ (\bmod\ m)\)

推论

\(g\)\(m\)的一个原根,则\(S=\{g^s|1\le s\le\varphi(m),s\perp \varphi(m)\}\)

证明:(待补充link

求原根

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

2、找最小原根\(g\),已知最小原根大小不超过\(m^{0.25}\),暴力枚举,用原根判定定理判断

3、求\(g\)\(1\thicksim \varphi(m)\)次方,\(g^s\)\(s\perp \varphi(m)\)为原根,找出\(\varphi(\varphi(m))\)个即可

时间复杂度为\(O(m^{0.25}\log m+\varphi(m)\log \varphi(m))\)

\(p.s.\) \(998244353\)的最小原根是\(3\)

BSGS

求解\(a^x\equiv b\pmod p\)\(a\)\(p\)互质

原理:根号平衡

\(x=i*\lfloor\sqrt p\rfloor-j\),则有\(1\le i,j\le \lfloor\sqrt p\rfloor\)

原式化为:\(a^{i*\lfloor\sqrt p\rfloor-j}\equiv b\pmod p\)

\(a^{i*\lfloor\sqrt p\rfloor}\equiv b*a^j\pmod p\)

\(b*a^j\)扔进map里,在遍历\(a^{i*\lfloor\sqrt p\rfloor}\)时Check就行了

时间复杂度\(O(\sqrt p\log \sqrt p)\)

拓展BSGS

即不一定满足\(a,p\)互质

考虑变形:\(a^x+kp=b\)

\(a^{x-1}\cdot a+kp=b\)

由裴蜀定理,将\(a^{x-1}\)看作\(a\)的系数,则该方程有解的充要条件是\(\gcd(a,p)\mid b\)

\(d=\gcd(a,p)\),则\(\displaystyle a^{x-1}\cdot \frac{a}{d}+k\cdot\frac{p}{d}=\frac{b}{d}\)

然后将\(\displaystyle a^{x-1},\frac{p}{d},\frac{b}{d}\)作为新的\(a^x,p,b\) 处理

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

最后把相应系数乘上即可

施工中...

posted @ 2024-10-31 17:19  Zhone_lb  阅读(108)  评论(0)    收藏  举报