基础数论 整除分块与欧拉函数

整除分块#

例题:#

已知 f(n)=i=1nni,给定 n,求 f(n) 的值。

固然可以 O(n) 暴力,但显然会TLE

计算一下前几项的值之后可以发现ni 的取值在连续的一段区间内是相同的,那么就可以将其分为若干块分别进行计算。

先让 l 为区间的左端点,那么这块的值都为 k=nlr=max(i)=nk。将 k 代入,得到 r=nnl。这样每一块的左右端点都能用确定的式子得到了。这样分块的值就为单值 × 区间长度,即 k×(rl+1)

 

模板:#

代码
ll division_block(ll n){
	ll res = 0;
    for(ll l = 1, r; l <= n; l = r + 1){
        r = n / (n / l);
        res += n / l * (r - l + 1);
    }
    return res;
}

 

欧拉函数:#

定义:#

欧拉函数是指 1N​ 中与 N​ 互质的数的个数,记为 φ(N)​。

φ(x)=i=1x[gcd(i,x)==1]

特别的 φ(1)=1

 

性质:#

1.若 x​ 为质数, φ(x)=x1

质数除了他本身都与他互质。

2.n>1,1n 中与 n 互质的数的和为 n×φ(n)/2

因为 gcd(n,x)==gcd(n,nx) ,所以与 x 不互质的数 x,nx 成对出现,平均值为 n2 ,所以与 n 互质的数的平均值也是 n2 ,而这样的数共有 φ(n) 个,故得性质2。

3.若 x=pk(p)​ ,则 φ(x)=(p1)×pk1​。

发现所有 p​ 的倍数都与 x​ 不互质,其他数都与 x​ 互质,而 p​ 的倍数共有 pk1​ 个(包括 x​ )。

φ(x)=pkpk1=(p1)×pk1

4.若 p,q 互质,则 φ(p×q)=φ(p)×φ(q) ,即欧拉函数为积性函数。

如果 ap 互质 (a<p)bp 互质 (b<q)cpq 互质 (c<pq) ,则 c 与数对 (a,b) 是一一对应的。

符合条件的 aφ(p) 种, bφ(q) 种, 则所对应的 (a,b) 数对有 φ(p)φ(q) 种。而符合条件的 cφ(pq) 种。

所以 φ(pq)=φ(p)×φ(q)

5.对于一正整数 x=p1c1×p2c2×...×pncn

φ(x)=x×i=1n(11pi)

证明:

φ(x)=i=1nφ(pici)=i=1n(pi1)×pici1=i=1npiki×(11pi)=xi=1n(11pi)

6.若 p​ 为 x​ 的质因数,则 φ(x×p)=φ(x)×p

φ(x×p)=x×i=1n(11pi)×p=φ(x)×p(p[pi])

7.若质数 p 不是 x 的因数,则 φ(x×p)=φ(x)×(p1)

φ(x×p)=φ(x)×φ(p)=φ(x)×(p1)

dnφ(d)=n

f(n)=dnφ(d)

f(a×b)=dabφ(d)

gcd(a,b)=1: gcd(dia,dib)=1

dabφ(d)=daφ(d)×dbφ(d)

​ 即 f(a×b)=f(a)×f(b)​​​​

f(pm)=fpmφ(d)=i=0mφ(pi)=1+i=0m1(p1)×pi(p)
              =1+(p1)×(1+p++pm1)
              =1+(p1)×1pm1p=pm

f(pm)=pm

f(n)=f(i=1npici)=i=1nf(pici)=i=1npici=n

dnφ(d)=n

 

代码:#

1.求解单个欧拉函数:利用性质 5 ,时间复杂度 O(n)

代码
int phi(int n) {
	int ans = n;
	int t = sqrt(n);
	for(int i=2; i<=t; ++i) {
		if(n%i == 0)
			ans = ans/i*(i-1);
		while(n%i == 0) n /= i;
	}
	if(n > 1) ans = ans/n/(n-1);
	return ans;
}

 

  1. 埃氏筛求 1n的欧拉函数值,时间复杂度 O(nlogn)
代码
void found_euler(int n) {
	for(int i=1; i<=n; ++i) phi[i] = i;
	for(int i=2; i<=n; ++i) {
		if(phi[i] == i) { // i为质数 
			for(int j=i; j<=n; j+=i) // 给包含质因子i的数字,乘上 (1-1/i) 
				phi[j] = phi[j]/i*(i-1); 
		}
	}
} 

 

3.欧拉筛求 1n 的欧拉函数值,时间复杂度 O(n)

代码
int phi[N],pr[N],cnt;
bool vis[N];
void init(){
	int n=1e5+50;
	phi[1]=1; 
	for(int i=2;i<=n;i++){
		if(!vis[i]){pr[++cnt]=i,phi[i]=i-1;}
		for(int j=1;j<=cnt&&pr[j]<=n/i;j++){
			vis[i*pr[j]]=1;
			phi[i*pr[j]]=phi[i]*((i%pr[j])?pr[j]-1:pr[j]); 
			if(i%pr[j]==0)break;
		} 
	}
}

 

GCD SUM#

i=1nj=1ngcd(i,j)

原式可化为

=i=1nj=1ndgcd(i,j)φ(d)=i=1nj=1nd=1nφ(d)[di][dj]=d=1nφ(d)i=1nj=1n[di][dj]=d=1nφ(d)nd2

 

GCD#

给定正整数 n1x,yn&&gcd(x,y)prime 的数对有多少。

=pprimei=1nj=1n[gcd(i,j)=p]=pprimei=1npj=1np[gcd(i,j)=1]=pprime(i=1np(2×j=1i[gcd(i,j)=1])1)=pprime(2i=1npφ(i)1)

 

Longge 的问题#

i=1ngcd(i,n)

=i=1ngcd(i,n)=dnd×i=1n[gcd(i,n)=d]=dnd×i=1nd[gcd(i,nd)=1]=dnd×φ(nd)

by ysx

posted @   班级账号  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示