线性筛可以筛出一堆积性函数,逐一复习一下.
定义: μ(1)=1,若n可以分解为k个互异素数的乘积,则μ(n)=(−1)k,其他情况,μ(n)=0 μ ( 1 ) = 1 , 若 n 可 以 分 解 为 k 个 互 异 素 数 的 乘 积 , 则 μ ( n ) = ( − 1 ) k , 其 他 情 况 , μ ( n ) = 0
在线性筛中,每个数都只会被它最小的质因数所筛到.
质数的莫比乌斯函数显然为-1
所以当 i%prime[j]==0
时,n已经有两个prime[j]的质因子,所以 μ(i∗prime[j])=0 μ ( i ∗ p r i m e [ j ] ) = 0 .
另一种情况i%prime[j]!=0
,相当于对在当前i的基础上又多了一个质因子,所以 μ(i∗prime[j])=−μ(i) μ ( i ∗ p r i m e [ j ] ) = − μ ( i )
定义: ϕ(n)为小于n的,与n互质的数的个数 ϕ ( n ) 为 小 于 n 的 , 与 n 互 质 的 数 的 个 数
当p为质数时, ϕ(p)=p−1 ϕ ( p ) = p − 1
当i%prime[j]==0
, ϕ(i∗prime[j])=ϕ(i)∗prime[j] ϕ ( i ∗ p r i m e [ j ] ) = ϕ ( i ) ∗ p r i m e [ j ]
当i%prime[j]!=0
, ϕ(i∗prime[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[i∗prime[j]]=d[i]/(num[i]+1)∗(num[i]+2),num[i∗prime[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[i∗prime[j]]=d[i]∗(prime[j]+1),num[i∗prime[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[i∗prime[j]]=sd[i]/f[i]∗(f[i]∗prime[j]+1),f[i∗prime[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[i∗prime[j]]=sd[i]∗sd[prime[j]],f[i∗prime[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]+x∗p[i]≡c[j]+x∗p[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 有整数解,当且仅当 m是gcd(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±2∗a和x±2∗b x ± 2 ∗ a 和 x ± 2 ∗ b 以及若干次 y±2∗a和y±2∗b y ± 2 ∗ a 和 y ± 2 ∗ b 和最多各一次的 x±a,y±b x ± a , y ± b .
因此我们只需要枚举后面两种操作的出现情况,然后利用裴蜀定理判断.
即 2∗a∗p+2∗b∗q=x,2∗a∗q+2∗b∗p=y(注意这里的x,y是枚举后两种操作之后得到的) 2 ∗ a ∗ p + 2 ∗ b ∗ q = x , 2 ∗ a ∗ q + 2 ∗ b ∗ p = y ( 注 意 这 里 的 x , y 是 枚 举 后 两 种 操 作 之 后 得 到 的 ) 是否有解即可.
Code
总结
裴蜀定理虽然听上去是个新名词,可是我们已经将它运用过很多次了,不需要重点关照,按照平时的思路直接做即可.