数论学习笔记

Part 1 gcd,lcm \text{Part 1 gcd,lcm} Part 1 gcd,lcm

gcd ⁡ ( x , y ) \gcd(x,y) gcd(x,y)表示 x , y x,y x,y的最大公约数,代码实现:

int gcd(int x,int y){return y?gcd(y,x%y):x;}

从代码中可以发现,每次 x , y x,y x,y中有一个数至少减了一半,所以时间复杂度为 Θ ( log ⁡ min ⁡ ( x , y ) ) \Theta(\log \min(x,y)) Θ(logmin(x,y))

lcm ( x , y ) \text{lcm}(x,y) lcm(x,y)表示 x , y x,y x,y的最小公倍数
lcm ( x , y ) = x × y gcd ⁡ ( x , y ) \text{lcm}(x,y)=\frac{x\times y}{\gcd(x,y)} lcm(x,y)=gcd(x,y)x×y

lcm ( x , y ) × gcd ⁡ ( x , y ) = x × y \text{lcm}(x,y)\times \gcd(x,y)=x\times y lcm(x,y)×gcd(x,y)=x×y

Part 2 exgcd \text{Part 2 exgcd} Part 2 exgcd

( 1 ) (1) (1)贝祖定理:对于给定的正整数 a , b a,b a,b,关于 x , y x,y x,y的方程 a x + b y = c ax+by=c ax+by=c有整数解的充要条件是 c c c gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b)的整数倍。

( 2 ) exgcd (2)\text{exgcd} (2)exgcd正是贝祖定理中方程的解。

( 3 ) (3) (3)我们发现每次递归的时候 x = y 1 , y = x 1 − ⌊ a / b ⌋ × y 1 x=y1,y=x1-\lfloor a/b\rfloor\times y1 x=y1,y=x1a/b×y1,而当递归的 y = 0 y=0 y=0的时候易得该方程的一组解是 x = 0 , y = 1 x=0,y=1 x=0,y=1,然后逐层回溯得到其它解。

代码实现:

void exgcd(int a,int b)
{
	if (b==0){x=1,y=0;return;}
	exgcd(b,a%b);
	int t=x;
	x=y;
	y=t-(a/b)*y;
}

注意,此处的 x , y x,y x,y是全局变量。

Part 3  \text{Part 3 } Part 3 莫比乌斯函数、反演

( 1 ) (1) (1)莫比乌斯函数表示为 μ ( i ) \mu(i) μ(i),函数值:
μ ( n ) = { 1                         ( n = 1 ) ( − 1 ) k               ∀ v p ( n ) ≤ 2 0                    ∃ v p ( n ) > 2 \mu(n)=\left\{ \begin{aligned} \text{1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }(n=1)\\ (-1)^k\text{\ \ \ \ \ \ \ \ \ \ \ \ \ }\forall v_p(n)\le 2 \\ 0\text{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\exists v_p(n)>2 \end{aligned} \right. μ(n)=1                        (n=1)(1)k             vp(n)20                  vp(n)>2
( 2 ) (2) (2)性质:
∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]
( 3 ) (3) (3)筛前缀和:欧拉筛 ( ( (时间复杂度 Θ ( n ) ) \Theta(n)) Θ(n))、杜教筛 ( ( (时间复杂度 Θ ( n 2 3 ) ) \Theta(n^\frac 2 3)) Θ(n32))

代码 ( ( (欧拉筛 ) ) )

for (int i=2;i<=n;++i)
{
	if (!bz[i]) prime[++tot]=i,mu[i]=-1;
	for (int j=1;j<=tot && i*prime[j]<=n;++j)
	{
		bz[i*prime[j]]=1;
		if (i%prime[j]==0{mu[i*prime[j]]=0;break;}
		mu[i*prime[j]]=-mu[i];	
	}
}
for (int i=1;i<=n;++i) sum[i]=sum[i-1]+mu[i];

代码 ( ( (杜教筛 ) ) )

int S(int x)
{
	if (x<N) return mu[x];
	if (sum[x]) return sum[x];
	int o=1;
	for (int i=2,lt;i<=x;i=lt+1) lt=x/(x/i),o-=(lt-i+1)*S(x/i);
	sum[x]=o;
	return o;
}

( 4 ) (4) (4)莫比乌斯反演定理:若 F ( n ) , f ( n ) F(n),f(n) F(n),f(n)为算数函数且满足
F ( n ) = ∑ d ∣ n f ( n ) F(n)=\sum_{d|n}f(n) F(n)=dnf(n)
则有
f ( n ) = ∑ d ∣ n μ ( d ) F ( n d ) = ∑ d ∣ n μ ( n d ) F ( d ) f(n)=\sum_{d|n}\mu(d)F(\frac n d)=\sum_{d|n}\mu(\frac n d)F(d) f(n)=dnμ(d)F(dn)=dnμ(dn)F(d)
( 5 ) (5) (5)较常见的莫比乌斯反演

∑ i = 1 n ∑ j = 1 m [ gcd ⁡ ( i , j ) = k ] \large{\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)=k]} i=1nj=1m[gcd(i,j)=k]
∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ [ gcd ⁡ ( i , j ) = 1 ] \large{\sum_{i=1}^{\lfloor \frac n k\rfloor}\sum_{j=1}^{\lfloor \frac m k\rfloor}[\gcd(i,j)=1]} i=1knj=1km[gcd(i,j)=1]
∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ ∑ d ∣ gcd ⁡ ( i , j ) μ ( d ) \large{\sum_{i=1}^{\lfloor \frac n k\rfloor}\sum_{j=1}^{\lfloor \frac m k\rfloor}\sum_{d|\gcd(i,j)}\mu(d)} i=1knj=1kmdgcd(i,j)μ(d)
∑ d = 1 min ⁡ μ ( d ) ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ 1 \large{\sum_{d=1}^{\min}\mu(d)\sum_{i=1}^{\lfloor \frac n k\rfloor}\sum_{j=1}^{\lfloor \frac m k\rfloor}1} d=1minμ(d)i=1knj=1km1
∑ d = 1 min ⁡ μ ( d ) ⌊ n k ⌋ ⌊ m k ⌋ \large{\sum_{d=1}^{\min}\mu(d)\lfloor \frac n k\rfloor\lfloor \frac m k\rfloor} d=1minμ(d)knkm
μ ( d ) \mu(d) μ(d)的前缀和可以欧拉筛、杜教筛随便乱搞, ⌊ n k ⌋ ⌊ m k ⌋ \lfloor \frac n k\rfloor\lfloor \frac m k\rfloor knkm随便数论分块一下就行了,时间复杂度 Θ ( n + n ) \Theta(n+\sqrt n) Θ(n+n ) Θ ( n 2 3 + n ) \Theta(n^{\frac 2 3}+\sqrt n) Θ(n32+n )

( 6 ) (6) (6) μ \mu μ的前缀和求 φ \varphi φ的前缀和:
∑ i = 1 n φ ( i ) \large\sum_{i=1}^{n}\varphi(i) i=1nφ(i)
∑ i = 1 n ∑ j = 1 i − 1 [ gcd ⁡ ( i , j ) = 1 ] \large\sum_{i=1}^{n}\sum_{j=1}^{i-1}[\gcd(i,j)=1] i=1nj=1i1[gcd(i,j)=1]
∑ i = 1 n ∑ j = 1 n [ gcd ⁡ ( i , j ) = 1 ] 2 \large\frac{\sum_{i=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)=1]}{2} 2i=1nj=1n[gcd(i,j)=1]
为了方便先单独挑出分子进行分解
∑ i = 1 n ∑ j = 1 n [ gcd ⁡ ( i , j ) = 1 ] \large\sum_{i=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)=1] i=1nj=1n[gcd(i,j)=1]
∑ i = 1 n ∑ j = 1 n ∑ d ∣ gcd ⁡ ( i , j ) μ ( d ) \large\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{d|\gcd(i,j)}\mu(d) i=1nj=1ndgcd(i,j)μ(d)
∑ d = 1 n μ ( d ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ n d ⌋ 1 \large\sum_{d=1}^{n}\mu(d)\sum_{i=1}^{\lfloor \frac n d\rfloor}\sum_{j=1}^{\lfloor \frac n d\rfloor}1 d=1nμ(d)i=1dnj=1dn1
∑ d = 1 n μ ( d ) ⌊ n d ⌋ 2 \large\sum_{d=1}^{n}\mu(d){\lfloor \frac n d\rfloor}^2 d=1nμ(d)dn2
所以
∑ i = 1 n φ ( i ) = ∑ d = 1 n μ ( d ) ⌊ n d ⌋ 2 2 \large\sum_{i=1}^{n}\varphi(i)=\frac{\sum_{d=1}^{n}\mu(d){\lfloor \frac n d\rfloor}^2}{2} i=1nφ(i)=2d=1nμ(d)dn2 μ ( d ) \mu(d) μ(d)用欧拉筛、杜教筛照搞,后面照样数论分块,时间复杂度 Θ ( n + n ) \Theta(n+\sqrt n) Θ(n+n ) Θ ( n 2 3 + n ) \Theta(n^{\frac 2 3}+\sqrt n) Θ(n32+n )

剩余待更 . . . . . . ...... ......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值