忆点点数论--质数与约数
0x31 质数
定义
不会就getout
判定
试除法
筛法(求 \(1\) 到 \(n\) 内的素数)
Eratosthenes 筛法
代码
prt[1]=1;
for(int i=2;i<=n;i++){
if(prt[i])continue;
for(int j=i;j*i<=n;j++) prt[i*j]=1;
时间复杂度: \(O\left(\sum\limits_{\text{质数 }p\leq N} \dfrac{N}{p}\right)=O(N\log\log N)\)。
线性筛
代码
prt[1]=1;
for(int i=2;i<=n;i++){
if(!prt[i])pr[++cnt]=i;
for(int j=1;pr[j]*i<=n;j++){
prt[i*pr[j]]=1;
if(!(i%pr[j]))break; // 此句为重点,后面筛时可用更小的pr[j]代替
}
}
时间复杂度: \(O(n)\)。
算术基本定理
任意一个大于 \(1\) 的数 \(N\),可写作:
其中 \(c_i\) 都为正整数,\(p_i\) 都为质数,且满足 \(p_1<p_2<\cdots<p_m\)。
调和级数
素数分布
\(N\) 以内质数个数:
即每 \(\ln N\) 个数中可能有一个质数。
则暴力求第一个比 \(x\) 大(或小)的质数的时间复杂度为 \(O(\sqrt{x}\ln x)\)。\(x\le 10^{14}\) 可 1s 过。
P1835 素数密度
题目来源: P1835 素数密度
题目描述
给定 \(L,R\),请计算区间 \([L,R]\) 中素数的个数。
\(1\leq L\leq R < 2^{31}\),\(R-L\leq 10^6\)。
题解
观察到 \(R-L\) 很小,且任意一个合数 \(n\) 都必定包含一个不超过 \(\sqrt{n}\) 的质因子。
所以,我们只需要筛出 \(2\sim\sqrt{R}\) 之间的所有质数。对于每个 \(p\) 把 \([L,R]\) 中 \(p\) 的倍数筛掉。最后 \([L,R]\) 之间未被筛去的便是质数。
时间复杂度: \(O\left(\sum\limits_{\text{质数 }p\leq \sqrt{R}} \dfrac{R-L}{p}\right)=O\left(\sqrt{R}\log\log\sqrt{R}+(R-L)\log\log R\right)\)。
P10495 阶乘分解
题目来源: P10495 阶乘分解
题目描述
给定整数 \(N\;(3\le N\le 10^6)\),试把阶乘 \(N!\) 分解质因数,按照算术基本定理的形式输出分解结果中的 \(p_i\) 和 \(c_i\) 即可。
题解
我们可以先筛出 \(1\sim n\) 内每个质数 \(p\),再逐个考虑 \(N!\) 中有几个 \(p\)。
看 \(N!\) 中有几个 \(p\),只需要看 \(1\sim N\) 中每个数有几个 \(p\)。
- 至少有一个 \(p\) 的数的个数为:\(\left\lfloor \dfrac{N}{p}\right\rfloor\)
- 至少有两个 \(p\) 的数个数为:\(\left\lfloor \dfrac{N}{p^2}\right\rfloor\)
但因与一个 \(p\) 所计算的有重复,因此只需要计算一次。
综上所述,\(N!\) 中 \(p\) 的个数为:
\(1\sim N\) 中质数约有 \(O(N/\log N)\) 个,每个质数计算所需时间复杂度为 \(O(\log N)\),因此总体时间复杂度为:\(O(N)\)。
0x32 约数
定义
你猜
算数基本定理推论
若正整数 \(N\) 被唯一分解为 \(N=p_{1}^{c_{1}}p_{2}^{c_{2}}p_{3}^{c_{3}}\!\ldots p_{m}^{c_{m}}\),其中 \(c_i\) 都为正整数,\(p_i\) 都为质数,且满足 \(p_1<p_2<\cdots<p_m\),则 \(N\) 的正约数集合可表示为:
\(N\) 的正约数个数为:
\[\prod_{i=1}^{m}(c_i+1) \]
正约数和为:
\[\prod_{i=1}^{m} \left(\sum_{j=0}^{c_i}(p_i)^j\right) \]
试除法
一个正整数 \(N\) 因数的上界为 \(2\sqrt{N}\)。
倍数法
\(1\sim N\) 每个数约数个数的总和约为 \(N\log N\)。
P1463 [POI 2001] [HAOI2007] 反素数
题目来源: P1463 反素数
题目描述
对于任何正整数 \(x\),其约数的个数记作 \(g(x)\)。例如 \(g(1)=1\),\(g(6)=4\)。
如果某个正整数 \(x\) 满足:\(\forall\,0<i<x\),都有 \(g(x)>g(i)\),则称 \(x\) 为反质数。例如,整数 \(1,2,4,6\) 等都是反质数。
现在给定一个数 \(N\),你能求出不超过 \(N\) 的最大的反质数么?
\(1 \leq N \leq 2 \times 10^9\)
题解
引理 1: \(1\sim N\) 中最大的反质数是因数最多的数中最小的一个。
证明:
反证法:假定 \(1\sim N\) 中最大反质数为 \(p\),且不为引理所说,设引理所说数为 \(x\)。
- 若 \(x<p\):因 \(p\) 的因数个数 \(\leq x\) 的因数个数,\(p\) 不为反质数,矛盾。
- 若 \(x>p\):由设定得 \(x\) 必为反质数且 \(x>p\),与所求矛盾。
证毕。
引理 2: 所得反质数质因子个数最多 \(10\) 个,且质因子指数和最大不超过 \(30\)。
证明: 自己算。
引理 3: 反素数在质因数分解后质因子必定连续且质因数次幂必定单调不升。
证明:
若该数质因子不连续,则可用一个与该数最大质因子同次幂的较小质因子替换最大质因子,此时新数更小且因数个数与原数相同,则原数不为反素数。
次幂单调不升同理。
由上面三个引理,我们可以采用 DFS 搜索完成本题。
时间复杂度: \(O(\)米奇妙妙屋\()\)。
整除分块
对于 \(\forall\,i\in[1,n]\cap\mathbb{N}^+\),设 \(f(i)=\left\lfloor \dfrac{n}{i}\right\rfloor\),将所有 \(f(i)\) 相等的 \(i\) 分为一块。
向下取整性质: \(\left\lfloor \dfrac{n}{x}\right\rfloor = y \;\Longrightarrow\; \left\lfloor \dfrac{n}{y}\right\rfloor = x\quad (x\leq y)\)。
试求 \(\displaystyle\sum_{i=1}^{n}\left\lfloor \frac{k}{i}\right\rfloor\)。
发现该求和中有较多部分数字相等且连续,考虑对于相等且连续部分一并求和,以此优化。
考虑一块连续且相等的部分的左端点与右端点:
- 左端点一开始显然为 \(1\),后面的块的左端点则是前一个块右端点的下一个。
- 设左端点所在位置为 \(x\),设右端点为 \(y\),则 \(y\) 满足 \(\lfloor k/y\rfloor = \lfloor k/x\rfloor\) 且 \(\lfloor k/(y+1)\rfloor \neq \lfloor k/x\rfloor\),易得 \(y = \big\lfloor k / \lfloor k/x\rfloor \big\rfloor\)。
知道块的左右端点且该块中值都相等,方可在 \(O(1)\) 时间内求出一个块的答案。
时间复杂度分析:
- 当 \(i \leq \sqrt{k}\) 时,\(\left\lfloor \dfrac{k}{i}\right\rfloor \geq \sqrt{k}\),此时取值最多 \(\sqrt{k}\) 个。
- 当 \(i > \sqrt{k}\) 时,\(\left\lfloor \dfrac{k}{i}\right\rfloor < \sqrt{k}\),此时取值最多依然 \(\sqrt{k}\) 个。
故块最多有 \(2\sqrt{k}\) 个。因此时间复杂度为 \(O(\sqrt{k})\)。
P2424 约数和
题目来源: P2424 约数和
题目描述
对于一个数 \(X\),函数 \(f(X)\) 表示 \(X\) 所有约数的和。例如:\(f(6)=1+2+3+6=12\)。对于一个 \(X\),Smart 可以很快地算出 \(f(X)\)。现在的问题是,给定两个正整数 \(X,Y\;(X<Y)\),Smart 希望尽快地算出 \(f(X)+f(X+1)+\cdots+f(Y)\) 的值,你能帮助 Smart 算出这个值吗?
\(1\leq X<Y\leq 2\times 10^9\)。
题解
可以将 \(\displaystyle\sum_{i=X}^{Y}f(i)\) 变为 \(\displaystyle\sum_{i=1}^{Y}f(i)-\sum_{i=1}^{X-1}f(i)\),则我们需要求 \(\displaystyle\sum_{i=1}^{n}f(i)\)。
逐个考虑每个约数对答案的贡献,可得到下面式子:
考虑整除分块,发现一个块内的值为等差数列,使用等差数列求和即可。
时间复杂度: \(O(\sqrt{Y})\)。
代码:
ll ssum(ll n){
ans=0;ll k=n;
for(ll x=1,gx;x<=n;x=gx+1){
gx=k/x?min(k/(k/x),n):n;
ans+=(k/x)*(x+gx)*(gx-x+1)/2;
}
return ans;
}
Floor and Mod
题目来源: Floor and Mod
题目描述
求 \(1\leq a\leq x,\;1\leq b\leq y\) 且 \(\left\lfloor\dfrac{a}{b}\right\rfloor = a \bmod b\) 的 \((a,b)\) 个数。
题解
因此 \(a\) 为 \(b+1\) 的倍数。
且:
因此我们可得最后答案为:
可分为两部分枚举,\(i^2+i-1\le x\) 时 \(i\le\sqrt{x}\) ,在 \(i^2+i-1>x\) 后用整除分块处理即可
时间复杂度:\(O(\sqrt{y})\) 。
最大公约数与最小公倍数
定义
略
定理
证明: 略(懒)
更相减损术
证明:
设 \(a\) 与 \(b\) 的公约数为 \(d\) ,设 \(a=d*k_0\),\(b=d*k_1\),则\(a-b=d*(k_0-k_1)\),即 $d|(a-b) $。
反之同理,则 \(a-b\) 与 \(a\) 和 \(b\) 的公约数集相等,则 \(gcd\) 相等。
辗转相除法
证明:
若 \(a<b\),命题显然成立。
若\(a\geq b\),我们设 \(a=p\times b+r\),其中\(0\leq r <b\)。则 \(r=a\) \(mod\) \(b\)。若\(d\) 为\(a,b\) 的公约数,则有 \(d|a\) 且 \(d|(p\times b)\),那么就有 \(d|(a-p\times b)\),即 \(d|r\),因此 \(d\) 也是 \(b,r\) 的公约数。反之亦成立。故\(b\) 的公约数集合和\(a\) \(mod\) \(b\) 的公约数集合相同,于是它们的最大公约数也相同。
证毕。
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
该 \(gcd\) 时间复杂度为 \(O(\log(a+b))\) 。
互质and欧拉函数
互质定义
你不会不知道吧 重开吧
积性函数
如果 \(a,b\) 互质,有 \(f(ab)=f(a)*f(b)\) ,则称函数 \(f\) 为积性函数。
性质
若在算数基本定理中 $ n = \prod_{i=1}^{m} p_i^{c_i} $,则 $ f(n)= \prod_{i=1}^m f(p_{i}^{c_i }) $。
证明:
把 \(n\) 分解质因数,由积性函数定义,该性质显然成立。
欧拉函数
1~N中与N互质的数的个数被称为欧拉函数,记为 \(\varphi(N)\)。
欧拉函数计算式
若在算数基本定理中,$ N= p_1 ^{c_1} p_{2}^{c_{2}}... p^{c_m}_{m} $ 则:
证明:
设 \(p\) 是 \(N\) 的质因子, \(1\) ~ \(N\) 中 \(p\) 的倍数有 \(p,2p,3p,...,(N/p)*p\) ,共 \(N/p\) 个。同理,若 \(q\) 也是 \(N\) 的质因子,则 \(1\) ~ \(N\) 中 \(q\) 的倍数有 \(N/q\) 个,对 \(N\) 的全部质因子使用容斥原理,即可得到与 \(N\) 互质数的个数。
由上述计算式即可在 \(O(\log{N})\) 的时间内求出欧拉函数。
性质
-
\(\forall n>1,1\)~\(n\) 中与n互质的数的和为 \(n*\varphi(n)/2\)。
证明:
因 \(gcd(n,x)=gcd(n,n-x)\) ,所以与 \(n\) 不互质的数 \(x,n-x\) 成对出现,平均值为 $n/2 $,因此,与 \(n\) 互质的数的平均值也为 \(n/2\) 。
-
若 \(a,b\) 互质,则 \(\varphi(ab)=\varphi(a)\varphi(b)\) 。
证明:
对 \(a,b\) 分别分解质因数,由欧拉计算式即可得到此性质。
-
设 \(p\) 为质数,若 \(p|n\) 且 \(p^2|n\) ,则 \(\varphi(n)\!=\!\varphi(n/p)*p\) 。
证明:
因为 \(p|n\) 且 \(p^2|n\) ,所以 \(n\) 与 \(n/p\) 包含相同质因子,不过是 \(p\) 的指数不同,则由欧拉函数计算式可得其性质
-
设 \(p\) 为质数,若 \(p\mid n\) 且 \(p^2\nmid n\) ,则 \(\varphi(n)\!=\!\varphi(n/p)*(p-1)\) 。
证明:
\(p\mid n\) 且 \(p^2\nmid n\) ,则 \(p\) 与 \(n/p\) 互质,且 \(p\) 为质数,所以 $\varphi(n)=\varphi(n/p)\varphi(p)=\varphi(n/p)(p-1) $ 。
-
设 \(p\) 为质数,则 $\varphi(pk)!=!pk!-!p^{k-1} $
证明:
在 \(n\) 以内,与质数 \(p\) 不互质的个数为 \(\lfloor\frac{n}{p}\rfloor=\lfloor\frac{~p^k}{p}\rfloor=p^{k-1}\),则在 \(n\) 以内与 \(p\) 互质的个数就是 \(n-p^{k-1}=p^k-p^{k-1}\),即\(\varphi(n)=p^k-p^{k-1}=p^{k-1}(p-1)\)。
-
$\sum_{d\mid n}!\varphi(d)!=!n $
证明:
设 \(n\) , \(m\) 互质,则可得:
\[\sum_{d\mid nm}\!\varphi(d)=\sum_{d\mid nm}\varphi(x)*\varphi(y)(x|n,y|m)=\left(\sum_{d\mid n}\varphi(d)\right)*\left(\sum_{d\mid m}\varphi(d)\right) \]即 \(\sum_{d\mid n}\!\varphi(d)\) 为积性函数。对于单个质因子 \(p\) :
\[\sum_{d\mid p^m}\!\varphi(d)\!=\!\varphi(1)+\varphi(p)+\varphi(p^2)+...+\varphi(p^m)=1+(p-1)+(p^2-p)+...+(p^m-p^{m-1})=p^m \]所以
\[\prod_{i=1}^{m}\sum_{d|p_i^{c_i}}\!\varphi(d)=\prod_{i=1}^m p_i^{c_i}=n \]证毕
这里还有另外一种证明方法,是偶然发现的,个人感觉更好一点。
\[ \begin{aligned} \varphi(n) &= \sum_{i=1}^{n} [\gcd(i, n) = 1] \\[4pt] &= n - \sum_{i=1}^{n} [\gcd(i, n) \neq 1] \\[4pt] &= n - \sum_{d \mid n,\, d \neq 1} \sum_{i=1}^{\frac{n}{d}} \left[ \gcd\left(i, \frac{n}{d}\right) = 1 \right] \end{aligned} \]这里的 \(d\) 是枚举的最大公约数。
所以
\[\begin{aligned} n &= \sum_{i=1}^{n} [\gcd(i, n) = 1] + \sum_{d \mid n,\, d \neq 1} \sum_{i=1}^{\frac{n}{d}} \left[ \gcd\left(i, \frac{n}{d}\right) = 1 \right] \\[4pt] &=\sum_{d \mid n } \sum_{i=1}^{\frac{n}{d}} \left[ \gcd\left(i, \frac{n}{d}\right) = 1 \right] \\[4pt] &=\sum_{d \mid n } \sum_{i=1}^{d} \left[ \gcd\left(i, d \right) = 1 \right] \\[4pt] &=\sum_{d \mid n } \varphi(d) \end{aligned} \]
OK啦。
求 \(1\)~\(N\) 的欧拉函数
借助性质\(3\)、\(4\),在线性质数筛上稍做改进,即可在 \(O(N)\) 时间内得到结果
code:
prime[1]=f[1]=1;
for(int i=2;i<=n;i++){
if(!prime[i])pr[++cnt]=i,f[i]=i-1;
for(int j=1;j<=cnt&&pr[j]*i<=n;j++){
prime[i*pr[j]]=1;
if(!(i%pr[j])){
f[i*pr[j]]=f[i]*pr[j];break;//性质3
}
else f[i*pr[j]]=f[i]*(pr[j]-1);//性质4
}
}
P2398 GCD SUM
题目描述
求
\(n\leq 10^5\)。
poof:
从\(1\)~\(n\)枚举 \(gcd\) 的值,设为\(x\)。
求有几对 \(i\),\(\!j\) 使得\(\gcd(i,j)=x\)。
当一对 \(a\),\(b\) 互质时,$ \gcd( x* a , x*b ) = x $ ,所以求 \(i\),\(j\) 个数变为求:
可用欧拉筛实现。
感谢观看

浙公网安备 33010602011771号