忆点点数论--质数与约数

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,可写作:

\[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\)

调和级数

\[f(n)=\sum_{i=1}^{n}\!\dfrac{1}{i}=\ln{x}\!+\!\gamma+\!\varepsilon_n\approx\ln{n}\approx\log{n} \]

素数分布

\(N\)以内质数个数:

\[F(N)\approx \frac{N}{\ln{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\) 的个数为:

\[\lfloor\frac{N}{p}\rfloor+\lfloor\frac{N}{p^2}\rfloor+\lfloor\frac{N}{p^2}\rfloor+\!...+\lfloor\frac{N}{p^{\lfloor\log_{p}\!{N}\rfloor}}\rfloor=\sum_{p^k\leq N}\lfloor\frac{N}{p^k}\rfloor \]

\(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\) 的正约数集合可表示为:

\[\{p_{1}^{b_{1}}p_{2}^{b_{2}}p_{3}^{b_{3}}\!...p_{m}^{b_m}\},其中\, 0\!\leq\! b_i\!\leq\!c_i \]

\(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\)~\(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)\)

逐个考虑每个约数对答案的贡献,可得到下面式子:

\[\sum_{i=1}^{n}\!f(i)=\sum_{i=1}^n i*\lfloor \frac{n}{i}\rfloor \]

考虑整除分块,发现一个块内的值为等差数列,使用等差数列求和即可。

时间复杂度:\(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:

\[\lfloor\frac{a}{b}\rfloor =a\bmod b=a-\lfloor\frac{a}{b}\rfloor *b \]

\[\lfloor\frac{a}{b}\rfloor =\frac{a}{b+1} \]

因此 \(a\)\(b+1\) 的倍数

\[\lfloor\frac{a}{b}\rfloor=a\bmod b=\frac{a}{b+1}<b \]

\[a\le b^2+b-1 \]

因此我们可得最后答案为:

\[\sum_{i=1}^{y}\left\lfloor\frac{min(x,i^2+i-1)}{i}\right\rfloor \]

可分为两部分枚举,\(i^2+i-1\le x\)\(i\le\sqrt{x}\) ,在 \(i^2+i-1>x\) 后用整除分块处理即可

时间复杂度:\(O(\sqrt{y})\)

最大公约数与最小公倍数

定义

定理

\[\forall a,b\!\in\!\N,\quad gcd(a,b)\!*\!lcm(a,b)\!=\!a\!*\!b \]

证明: 略(

更相减损术

\[\forall a,b\in\N,a\ge b ~~~~~~~ gcd(a,b)=gcd(a,a-b)=gcd(b,a-b) \]

证明:

\(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} $ 则:

\[\varphi(N)=N* \frac{p_1-1}{p_1} * \frac{p_2-1}{p_2} *...* \frac{p_m-1}{p_m} =N* \prod_{质数p|N} \left (1- \frac{1}{p} \right) \]

证明:

\(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})\) 的时间内求出欧拉函数。

性质

  1. \(\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\)

  2. \(a,b\) 互质,则 \(\varphi(ab)=\varphi(a)\varphi(b)\)

    证明:

    \(a,b\) 分别分解质因数,由欧拉计算式即可得到此性质。

  3. \(p\) 为质数,若 \(p|n\)\(p^2|n\) ,则 \(\varphi(n)\!=\!\varphi(n/p)*p\)

    证明:

    因为 \(p|n\)\(p^2|n\) ,所以 \(n\)\(n/p\) 包含相同质因子,不过是 \(p\) 的指数不同,则由欧拉函数计算式可得其性质

  4. \(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) $ 。

  5. \(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)\)

  6. $\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

题目描述

\[\sum_{i=1}^n \sum_{j=1}^n \gcd(i, j) \]

\(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\) 个数变为求:

\[\sum_{x=1}^{n}\sum_{a=1}^{\left\lfloor\frac{n}{x}\right\rfloor}\sum_{b=1}^{\left\lfloor\frac{n}{j}\right\rfloor}[a\perp b] \]

可用欧拉筛实现。

感谢观看

posted @ 2025-02-07 10:32  kilees  阅读(29)  评论(0)    收藏  举报
//