忆点点数论--质数与约数
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(\sum_{\text{质数}p\leq N} \frac{N}{p} )=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\!<\! ... <\!p_m\) 。
调和级数
素数分布
\(N\)以内质数个数:
即每\(\ln{N}\)个数中可能有一个质数
则暴力求第一个比\(x\)大(或小)的数的时间复杂度为\(O(\sqrt{x}\ln{x})\)。\(x\le 1e14\)可1s过
P1835 素数密度
题目描述
给定 \(L,R\),请计算区间 \([L,R]\) 中素数的个数。
\(1\leq L\leq R < 2^{31}\),\(R-L\leq 10^6\)。
poof:
观察到 \(R-L\) 很小,且任意一个合数 \(n\) 都必定包含一个不超过 \(\sqrt{n}\) 的质因子。
所以,我们只需要筛出 \(2\)~\(\sqrt{R}\) 之间的所有质数。对于每个 \(p\) 把 \([L,R]\) 中 \(p\) 的倍数筛掉。最后 \([L,R]\) 之间未被筛去的便是质数
时间复杂度: \(O(\sum_{\text{质数}p\leq \sqrt{R}} \frac{R-L}{p} )=O(\sqrt{R}\log\log{\sqrt{R}}+(R-L)\log\log{R})\)。
P10495 阶乘分解
题目描述
给定整数 \(N (3 \le N \le 10^6)\),试把阶乘 \(N!\) 分解质因数,按照算术基本定理的形式输出分解结果中的 \(p_i\) 和 \(c_i\) 即可。
poof:
我们可以先筛出 1~n 内每个质数 \(p\) ,再逐个考虑 \(N!\) 中有几个 \(p\) 。
看 \(N!\) 中有几个 \(p\) ,只需要看 \(1\) ~ \(N\) 中每个数有几个 \(p\) 。
至少有一个 \(p\) 的数的个数为:\(\lfloor \frac{N}{p}\rfloor\),
至少有两个 \(p\) 的数个数为: \(\lfloor \frac{N}{p^2}\rfloor\),
但因与一个\(p\) 所计算的有重复,因此只需要计算一次。
综上所述, \(N!\) 的 \(p\) 的个数为:
\(1\)~\(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}}\!...p_{m}^{c_{m}}\) ,\(c^i\) 都为正整数, \(p^i\) 都为质数,且满足 \(p_1\!<p_2\!<\! ... <\!p_m\) ,则 \(N\) 的正约数集合可表示为:
\(N\) 的正约数个数为:
正约数和为:
试除法
一个正整数\(N\)因数的上界为\(2\sqrt{N}\)。
倍数法
\(1\)~\(N\)每个数约数个数的总和约为 \(N\log{N}\)。
P1463 [POI 2001 ] [HAOI2007] 反素数
题目描述
对于任何正整数 \(x\),其约数的个数记作 \(g(x)\)。例如 \(g(1)=1\),\(g(6)=4\)。
如果某个正整数 \(x\) 满足:\(\forall 0 \lt i \lt x\),都有 \(g(x) \gt g(i)\),则称 \(x\) 为反质数。例如,整数 \(1,2,4,6\) 等都是反质数。
现在给定一个数 \(N\),你能求出不超过 \(N\) 的最大的反质数么?
\(1 \leq N \leq 2 \times 10^9\)
poof:
引理1:
\(1\)~\(N\)中最大的反质数是因数最多的数中最小的一个。
证明:
反证法:假定\(1\)~\(N\)中最大反质数为 \(p\) ,且不为引理所说,设引理所说数为 \(x\) 。
若 \(x\!<\!p\),因 \(p\) 的因数个数\(\leq\!x\) 的因数个数,\(p\) 不为反质数,矛盾。
若 \(x\!>\!p\),由设定得 \(x\) 必为反质数且 \(x\!>\!p\) 与所求矛盾。
证毕
引理2:
所得反质数质因子个数最多\(10\)个,且质因子指数和最大不超过\(30\)。
证明:~自己算~。
引理3:
反素数在质因数分解后质因子必定连续且质因数次幂必定单调不升。
证明:
若该数质因子不连续,则可用一个与该数最大质因子同次幂的较小质因子替换最大质因子,此时新数更小且因数个数与原数相同,则原数不为反素数。
次幂单调不升同理。
由上面3个引理,我们可以采用 \(DFS\) 搜索完成本题。
时间复杂度: \(O(\)米奇妙妙屋\()\)。
整除分块
对于 \(\forall ~i\!\in\![1,n]\cup\N^+\) 设 \(f(i)=\lfloor \frac{n}{i}\rfloor\) 将所有 \(f(i)\) 相等 \(i\) 分为一块。
向下取整性质:\(\lfloor \frac{n}{x}\rfloor\!=\!y\Rightarrow\lfloor \frac{n}{y}\rfloor\!=\!x (x\leq y)\)。
试求 \(\sum_{i=1}^{n}\lfloor \frac{k}{i}\rfloor\)
发现该求和中有较多部分数字相等且连续,考虑对于相等且连续部分一并求和,以此优化。
考虑一块连续且相等的部分的左端点与右端点。
左端点一开始显然为1,后面的块的左端点则是前一个块右端点的下一个。
设左端点所在位置为 \(x\) 设右端点为 \(y\) ,则 \(y\) 满足 \(\lfloor k/y\rfloor=\lfloor k/x\rfloor\)且 \(\lfloor k/y+1\rfloor\ne\lfloor k/x\rfloor\) ,易得 \(y\) 为 \(\lfloor k/\lfloor k/x\rfloor\rfloor\)。
知道块的左右端点且该块中值都相等,方可在\(O(1)\)时间内求出一个块的答案。
时间复杂度:
当 \(i\leq\sqrt{k}\) 时 \(\lfloor \frac{k}{i}\rfloor\ge\sqrt{k}\) 此时取值最多 \(\sqrt{k}\) 个。
当 \(i>\sqrt{k}\) 时 \(\lfloor \frac{k}{i}\rfloor<\sqrt{k}\) 此时取值最多依然 \(\sqrt{k}\) 个。
故块最多有 \(2\sqrt{k}\) 个。
因此时间复杂度为 \(O(\sqrt{k})\)。
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)+……+f(Y)\)的值,你能帮助 Smart 算出这个值吗?
\(1\leq X<Y\leq 2\times 10^9\)。
可以将 \(\sum_{i=X}^{Y}\!f(i)\) 变为 \(\sum_{i=1}^{Y}\!f(i)-\) \(\sum_{i=1}^{X-1}\!f(i)\) ,则我们需要求 \(\sum_{i=1}^{n}\!f(i)\) 。
逐个考虑每个约数对答案的贡献,可得到下面式子:
考虑整除分块,发现一个块内的值为等差数列,使用等差数列求和即可。
时间复杂度:\(O(\sqrt{Y})\) 。
code:
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
题目描述
求 \(1\le a\le x,1\le b\le y\) 且 \(\lfloor\frac{a}{b}\rfloor =a\bmod b\) 的\((a,b)\) 个数。
poof:
因此 \(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 \]证毕
求 \(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\) 个数变为求:
可用欧拉筛实现。
感谢观看