2018NOIP知识梳理(二)——数论相关(一)

  • 线性筛
    • 莫比乌斯函数
    • 欧拉函数
    • 约数个数
    • 约数和
  • 拓展欧几里得及裴蜀定理
    • 欧几里得算法
    • 拓展欧几里得
    • 裴蜀定理

线性筛

线性筛可以筛出一堆积性函数,逐一复习一下.

莫比乌斯函数

定义: μ(1)=1,nk,μ(n)=(1)k,,μ(n)=0 μ ( 1 ) = 1 , 若 n 可 以 分 解 为 k 个 互 异 素 数 的 乘 积 , 则 μ ( n ) = ( − 1 ) k , 其 他 情 况 , μ ( n ) = 0
在线性筛中,每个数都只会被它最小的质因数所筛到.
质数的莫比乌斯函数显然为-1
所以当 i%prime[j]==0 时,n已经有两个prime[j]的质因子,所以 μ(iprime[j])=0 μ ( i ∗ p r i m e [ j ] ) = 0 .
另一种情况i%prime[j]!=0,相当于对在当前i的基础上又多了一个质因子,所以 μ(iprime[j])=μ(i) μ ( i ∗ p r i m e [ j ] ) = − μ ( i )

欧拉函数

定义: ϕ(n)n,n ϕ ( n ) 为 小 于 n 的 , 与 n 互 质 的 数 的 个 数
当p为质数时, ϕ(p)=p1 ϕ ( p ) = p − 1
i%prime[j]==0, ϕ(iprime[j])=ϕ(i)prime[j] ϕ ( i ∗ p r i m e [ j ] ) = ϕ ( i ) ∗ p r i m e [ j ]
i%prime[j]!=0, ϕ(iprime[j])=ϕ(i)ϕ(prime[j])=ϕ(i)(prime[j]1) ϕ ( i ∗ p r i m e [ j ] ) = ϕ ( i ) ∗ ϕ ( p r i m e [ j ] ) = ϕ ( i ) ∗ ( p r i m e [ j ] − 1 )

约数个数

筛约数个数时,需要要个辅助数组,储存最小质因子的个数.
约数个数
当i为质数时, d[i]=2,num[i]=1 d [ i ] = 2 , n u m [ i ] = 1
i%prime[j]==0, d[iprime[j]]=d[i]/(num[i]+1)(num[i]+2),num[iprime[j]]=num[i]+1 d [ i ∗ p r i m e [ j ] ] = d [ i ] / ( n u m [ i ] + 1 ) ∗ ( n u m [ i ] + 2 ) , n u m [ i ∗ p r i m e [ j ] ] = n u m [ i ] + 1
i%prime[j]!=0, d[iprime[j]]=d[i](prime[j]+1),num[iprime[j]]=1 d [ i ∗ p r i m e [ j ] ] = d [ i ] ∗ ( p r i m e [ j ] + 1 ) , n u m [ i ∗ p r i m e [ j ] ] = 1

约数和

约数和
则需要的辅助数组为最小质因子对答案的贡献.
当i为质数时, sd[i]=i+1,f[i]=i+1 s d [ i ] = i + 1 , f [ i ] = i + 1
i%prime[j]==0, sd[iprime[j]]=sd[i]/f[i](f[i]prime[j]+1),f[iprime[j]]=f[i]prime[j]+1 s d [ i ∗ p r i m e [ j ] ] = s d [ i ] / f [ i ] ∗ ( f [ i ] ∗ p r i m e [ j ] + 1 ) , f [ i ∗ p r i m e [ j ] ] = f [ i ] ∗ p r i m e [ j ] + 1
i%prime[j]!=0, sd[iprime[j]]=sd[i]sd[prime[j]],f[iprime[j]]=prime[j]+1 s d [ i ∗ p r i m e [ j ] ] = s d [ i ] ∗ s d [ p r i m e [ j ] ] , f [ i ∗ p r i m e [ j ] ] = p r i m e [ j ] + 1

整体实现代码

拓展欧几里得及裴蜀定理

欧几里得算法

拓展欧几里得

求解不定方程: ax+by=gcd(a,b)=1 a x + b y = g c d ( a , b ) = 1
首先通过拓欧求得一组特解 (x0,y0) ( x 0 , y 0 )

然后可得通解 x=x0+(b/d)k,y=y0(a/d)k x = x 0 + ( b / d ) ∗ k , y = y 0 − ( a / d ) ∗ k

void exgcd(int a,int b,int &d,int &x,int &y){
    if(!b){
        d=a,x=1,y=0;
        return;
    }
    int xx,yy;
    exgcd(b,a%b,d,xx,yy);
    x=yy;
    y=xx-a/b*yy;
}

如果上述方程中的a,b不互质,则我们尽可能地将它们转为互质的.

拓欧的主要应用在(一)不定方程(二)模线性方程
例题:BZOJ-1407
枚举答案m进行验证.
对于每两个野人,它们不冲突当且仅当 c[i]+xp[i]c[j]+xp[j](modm) c [ i ] + x ∗ p [ i ] ≡ c [ j ] + x ∗ p [ j ] ( m o d m ) 无解,或者最小整数解大于min(l[i],l[j])
Code
习题:HDU-1211

裴蜀定理

裴蜀定理的内容:

设 a,b是不全为零的整数, 则存在整数 x,y 使得 ax+by=gcd(a,b) a x + b y = g c d ( a , b )
另一种说法不定方程 ax+by=m a x + b y = m 有整数解,当且仅当 mgcd(a,b) m 是 g c d ( a , b ) 的 倍 数

感觉这个东西应该在拓欧的时候说,但还是有些关于裴蜀定理的题

例题1:BZOJ-2257
题中的第三个操作得到的容量相当于 ax+by a x + b y ,因为x,y都是整数,由裴蜀定理,所以容量都是 gcd(a,b) g c d ( a , b ) 的倍数,又因为火星人会操作到尽可能小,最终的答案就是最大公约数.
那么问题也就转换为了在n个数中选k个,使得这k个数的最大公约数最大.
Code

例题2:CodeForces - 510D
假设我们只有两种卡片,那么想要使得每一个格子都到达则可以看作满足 ax+by=1 a x + b y = 1 ,由裴蜀定理可得,当且仅当a,b互质的时候满足条件.那么相当于我们要找一条从0开始,到1结束的最短路.边为卡片上的数和当前的数取最大公约数,费用为卡片的费用.用优先队列优化的dj即可.
Code

例题3:BZOJ-2299
如果我们将这种操作进行分类,则可以看为若干次 x±2ax±2b x ± 2 ∗ a 和 x ± 2 ∗ b 以及若干次 y±2ay±2b y ± 2 ∗ a 和 y ± 2 ∗ b 和最多各一次的 x±a,y±b x ± a , y ± b .
因此我们只需要枚举后面两种操作的出现情况,然后利用裴蜀定理判断.
2ap+2bq=x,2aq+2bp=y(x,y) 2 ∗ a ∗ p + 2 ∗ b ∗ q = x , 2 ∗ a ∗ q + 2 ∗ b ∗ p = y ( 注 意 这 里 的 x , y 是 枚 举 后 两 种 操 作 之 后 得 到 的 ) 是否有解即可.
Code

总结
裴蜀定理虽然听上去是个新名词,可是我们已经将它运用过很多次了,不需要重点关照,按照平时的思路直接做即可.

你可能感兴趣的:(知识梳理)