Q: 请以 O(N ) 的时间复杂度求解下式 ↓ i=1∑N⌊iN⌋
A: ⌊iN⌋ 这个数列是 呈块状连续分布 的, 设某个块的 左端点 为 l, 则这个块的 右端点 为 N/lN (向下取整略) ,
于是该块的和为 (r−l+1)∗⌊lN⌋,
代码很简短:
for(reg int l = 1, r; l <= N; l = r+1){
r = N/(N/l);
tmp += (r-l+1)*(N/l);
}
-
莫比乌斯函数
定义:
设 n=p1k1∗p2k2......pmkm
μ(n)=⎩⎪⎨⎪⎧1 n=1(−1)m ∏i=1mki=10 else
可以看出有 单个质因子的幂数超过1 的数字 莫比乌斯函数 值为 0 .
性质:
性质1: 莫比乌斯函数是 积性函数 :
μ(a∗b)=μ(a)∗μ(b) gcd(a,b)=1
根据这个性质, 可以 O(N) 进行 线性筛,
-
若当前数字 i 为质数, μ(i)=−1,
-
若 i%pj ==0, 说明 i∗pj 已经含有幂数大于 1的质因子, 所以 μ(i∗pj)=0,
-
否则说明 i 的质因子与 pj 共同构成 i∗pj的质因子,
于是 μ(i∗pj)=μ(pj)∗μ(i)=−μ(i),
这个式子同时处理了 μ(i)=0的情况 .
void sieve(){
mu[1] = 1, p_cnt = 0;
for(reg int i = 2; i < maxn; i ++){
if(!Used[i]) p[++ p_cnt] = i, mu[i] = -1;
for(reg int j = 1; j <= p_cnt && i*p[j] < maxn; j ++){
Used[i*p[j]] = 1;
if(i%p[j] == 0){ mu[i*p[j]] = 0; break ; }
else mu[i*p[j]] = -mu[i];
}
}
}
性质2:
d∣N∑μ(d)=[N==1]
证明:
-
N=1 时, μ(1)=1.
-
N!=1 时,
N=p1k1∗p2k2......pmkm, d=p1q1∗p2q2......pmqm,
由于 质因子幂 大于 1 的 μ 值为 0, 所以只需考虑 幂 为 0,1 的质因子项,
d∣N∑μ(d)=i=0∑m(mi)∗(−1)i
因为有 二项式定理, 所以
原式=i=0∑m(mi)∗(−1)i∗1m−i =(1−1)m =0
证毕.
二项式定理: (x+y)n=k=0∑n(mi)xn−kyn
-
莫比乌斯反演
若 f(n),g(n) 为数论函数, 且
f(N)=d∣N∑g(d)
则 莫比乌斯反演 为:
g(d)=d∣N∑μ(dN)f(d) 或者 d∣N∑μ(d)f(dN)
证明:
d∣N∑μ(d)f(dN) =d∣N∑μ(d)i∣dN∑g(i) =i∣N∑g(i)k∣iN∑μ(k) =g(N)
证毕.
说一下从第二步到怎么到第三步的,
先看第二步推导的含义: 枚举 N 的约数 d, 然后再去找与 μ(d) 相乘的 g(i),
分析 d 与 i 之间的关系, i∗t=dN ( t 为正整数), 进而得到 d∗t=iN, 即 d∣iN ,
于是枚举 i, 再枚举 iN 的约数进行计算, 即第三步
-
莫比乌斯反演的变形
若 F(x)=d=1∑⌊xN⌋g(dx)
则 g(x)=d=1∑⌊xN⌋F(dx)μ(d)
证明:
d=1∑⌊xN⌋F(dx)μ(d)=d=1∑⌊xN⌋μ(d)i=1∑⌊dxN⌋g(i∗dx)
设 i∗d=t (t∈[1,⌊xN⌋]), 则 d=t/i, 即 d∣t.
即与 F(tx) 进行运算的是 μ(t/i) .
于是枚举 t, 得到 ↓
原式=t=1∑⌊xN⌋g(tx)d∣t∑μ(d)=g(x)
证毕.
-
莫比乌斯反演的应用
求解gcd(i,j)=1的对数
解法:
i=1∑nj=1∑m[gcd(i,j)=1] (n<m)(1)
前面提到莫比乌斯函数的 性质2: i∣N∑μ(i)=[N==1]
将 N 换成 gcd(i,j) 得到 : i∣gcd(i,j)∑μ(i)=[gcd(i,j)=1]
再代入 1 式: i=1∑nj=1∑md∣gcd(i,j)∑μ(d)
再将 d 提出来 :
d=1∑n⌊dn⌋⌊dm⌋μ(d)
求解gcd(i,j)=k的对数
解法1:
将上方式子 n,m 换为 ⌊kn⌋,⌊km⌋ 即可.
解法2:
前面提到莫比乌斯反演的 变形:
若 F(x)=∑d=1xNg(dx), 则 g(x)=∑d=1xNF(dx)μ(d),
于是设 f(k) 为 gcd(i,j)=k 的对数, g(k) 为 k∣gcd(i,j) 的对数, 显然有
g(k)=i=1∑⌊kN⌋f(i∗k)=⌊kn⌋⌊km⌋
于是参照 莫比乌斯反演的变形. 得到
f(k)=x=1∑⌊kN⌋g(kx)μ(x)=x=1∑⌊kN⌋⌊kxn⌋⌊kxm⌋μ(x)
再提整除分块:
将 ⌊kxn⌋⌊kxm⌋ 整除分块时, 要保证块内 ⌊kxn⌋⌊kxm⌋ 相同, 每次可能就需要一个指针 “委曲求全”,
具体的说:
一个指针同时处理 n,m 的块, 从起点 1出发, 则下一步需要走到 r=min(n/(n/l),m/(m/l)).
求解gcd(i,j)的幂
i=1∑Nj=1∑Mgcd(i,j)k
解法:
待填坑…