zoukankan      html  css  js  c++  java
  • 杜教筛专题总结

    莫名其妙地写完了杜教筛的几道题?

    然而理解还是不怎么深刻啊

    主要是经常忘记 谁·谁=谁

    • 1.常用卷积

    [egin{aligned} mu * 1 &= epsilon \ mu * id &= varphi \ varphi * 1 &= id \ 1 * 1 &= d \ mu * d &= 1 \ id * 1 &= sigma \ end{aligned}]

    • 2.常用公式

    [egin{aligned} left [ n==1 ight ] &= sum limits_{d|n} mu(d) \ n &=sum limits_{d|n} varphi(d) \ varphi(ab) &= frac{varphi(a)varphi(b)gcd(a,b)}{varphi(gcd(a,b))} \ sumlimits_{i=1}^{n}d(i) &=sumlimits_{i=1}^{n} left lfloor frac{n}{i} ight floor \ d(ij)&=sum_{x|i}sum_{y|j}[gcd(x,y)==1]\ gcd(x^a-1,x^b-1)&=x^{gcd(a,b)}-1\ gcd(f[a],f[b])&=f[gcd(a,b)](f为菲波那契数列) end{aligned}]

    • 3.杜教筛(进入正题)

     我们需要解决的是快速求得 (S(n)=sumlimits_{i=1}^{n}f(i))
     考虑构造一个函数 (h) 使得 (h=f*g) (什么你问为什么?我怎么知道背过不就好了)

    [egin{aligned} h(n)&=sum limits_{d|n}f(d)g(n/d) \ sumlimits_{n=1}^N h(n) &=sum_{n=1}^Nsum limits_{d|n}f(d)g(n/d)\ &=sum_{d=1}^{N}g(d)sum_{i=1}^{ frac{N}{d} }f(i)\ &=sum_{d=1}^{N}g(d)S(frac{N}{d})\ &=g(1)S(n)+sum_{d=2}^{N}g(d)S(frac{N}{d})\ end{aligned}]

     然后得到了

    [egin{aligned} g(1)S(N)&=sum_{i=1}^{N}h(i)-sum_{i=2}^{N}g(i)S(frac{N}{i}) end{aligned}]

     也就这个柿子了

    • 4.例题

    (sum)
     题意描述:求(sumlimits_{i=1}^{n}varphi(i))(sumlimits_{i=1}^{n}mu(i))
     我们知道 (mu*1=epsilon)(varphi*1=id)
     代入柿子就完了

    神犇和蒟蒻
     题意:求 (sumlimits_{i=1}^{n}varphi(i^2))(sumlimits_{i=1}^nmu(i^2))
     很容易得知第二个柿子只有 (i==1) 时有值,所以答案衡为 (1)
     考虑第二个柿子,根据 (varphi(x)=xprodlimits_{i=1}^{k}(1-frac{1}{p_i}))(varphi(x^2)=xvarphi(x))
     所以要求的是 (S(n)=sumlimits_{i=1}^{n}ivarphi(i))
     推一下:

    [egin{aligned} h(n)&=f*g=sum_{d|n}(dvarphi(d))g(frac{n}{d})\ end{aligned}]

     考虑怎么消掉这个 (d) ,令 (g=id)

    [egin{aligned} 则h(n)&=sum_{d|n}d*varphi(d)*frac{n}{d}\ &=nsum_{d|n}varphi(d)\ &=n^2 end{aligned}]

     再代入柿子就好了

    [egin{aligned} g(1)S(n)&=sum_{i=1}^nh(i)-sum_{i=2}^ng(i)S(frac{n}{i})\ S(n)&=frac{n(n+1)(2n+1)}{6}-sum_{i=2}^niS(frac{n}{i}) end{aligned}]

    (Lucas)的数论
     题意描述:求 (sumlimits_{i=1}^nsumlimits_{j=1}^nd(ij))
     我们知道 (f(ij)=sumlimits_{x|i}sumlimits_{y|j}[gcd(x,y)==1])
     反演一下:

    [egin{aligned} &sum_{i=1}^nsum_{j=1}^nf(ij)\ &=sum_{i=1}^nsum_{j=1}^nsum_{x|i}sum_{y|j}[gcd(x,y)==1]\ &=sum_{i=1}^nsum_{j=1}^nsum_{x|i}sum_{y|j}sum_{d|gcd(x,y)}mu(d)\ &=sum_{x=1}^nsum_{y=1}^nleft lfloor frac{n}{i} ight floor left lfloor frac{n}{j} ight floorsum{d|gcd(i,j)}mu(d)\ &=sum_{d=1}^nmu(d)sum_{i=1}^{left lfloor frac{n}{d} ight floor}left lfloor frac{n}{id} ight floor sum_{j=1}^{left lfloor frac{n}{d} ight floor}left lfloor frac{n}{jd} ight floor\ &=sum_{d=1}^nmu(d)(sum_{i=1}^{left lfloor frac{n}{d} ight floor}left lfloor frac{n}{id} ight floor)^2\ end{aligned}]

     发现 (sumlimits_{i=1}^{left lfloor frac{n}{d} ight floor}left lfloor frac{n}{id} ight floor)^2) 可以在 (O(sqrt{left lfloor frac{n}{d} ight floor})) 时间内得到

     再把前面的 (mu) 杜教筛一下就没了

    选数
     题意描述:求 ([L,H]) 中选 (N) 个数最大公约数为 (K) 的方案数
     这题俩做法啊

    先说简单的,我们考虑将 (N) 个数都相等和不全相等分开考虑
     然后把 (L) 变成 (left lceil frac{L}{K} ight ceil),(H) 变成 (left lfloor frac{H}{K} ight floor)
     现在问题变成了从 ([L,H]) 中选 (N) 个不全相同的数使得他们 (gcd)(1)
     直接不好计算,考虑容斥
     设 (f(x)) 表示 ([L,H]) 中最大公约数为 (x) 的方案数,(F(x)) 表示 ([L,H]) 中最大公约数为 (x) 的倍数的方案数
     显然的,有 (f(x)=F(x)-sum_{x|d}f(d),F(x)=(left lfloor frac{H}{x} ight floor-left lfloorfrac{L-1}{x} ight floor)^N)
     而如果 (x>H-L)([L,H]) 中至多有 (1)(x) 的倍数,所以对答案没有贡献
     所以从 (H-L) 枚举到 (1) 就行了
     复杂度 (O((H-L)ln(H-L)))

    然后是杜教筛做法
     同样把 (L) 变成 (left lceil frac{L}{K} ight ceil),(H) 变成 (left lfloor frac{H}{K} ight floor)
     反演一下$$egin{aligned}
    &sum_{a=L}^Hsum_{b=L}^H...sum_{k=L}^H[gcd(a,b...k)==1]
    &=sum_{a=L}^Hsum_{b=L}^H...sum_{k=L}^Hsum_{d|gcd(a,b...k)}mu(d)
    &=sum_{d=1}^{H}mu(d)(left lfloor frac{H}{d} ight floor-left lfloor frac{L-1}{d} ight floor)^N
    end{aligned}$$

     快速幂+杜教筛就没了

    (DZY Loves Math IV)
     题意描述:求(sumlimits_{i=1}^nsumlimits_{j=1}^mvarphi(ij))
     观察到 (n) 很小可以枚举,考虑对于每个 (i) 如何求(sumlimits_{j=1}^mvarphi(ij))
     观察 (varphi(x)=xprodlimits_{i=1}^{k}(1-frac{1}{p_i}))
     发现我们可以把 (i=prod_{i=1}^kp_i^{e_i}) 分成两部分 (a=prodlimits_{i=1}^kp_i,b=prodlimits_{i=1}^kp_i^{e_i-1})
     则 (varphi(i)=bvarphi(a))
     设 (f(i,m)=sumlimits_{j=1}^mvarphi(ij))
     推一下$$egin{aligned}
    f(i,m)&=sumlimits_{j=1}^mvarphi(ij)
    &=bsum_{j=1}^mvarphi(aj)
    &=bsum_{j=1}^mvarphi(frac{a}{gcd(a,j)})varphi(j)gcd(a,j)
    &=bsum_{j=1}^mvarphi(frac{a}{gcd(a,j)})varphi(j)sum_{k|gcd(a,j)}varphi(k)
    &=bsum_{j=1}^mvarphi(j)sum_{k|gcd(a,j)}varphi(k)varphi(frac{a}{gcd(a,j)})
    &=bsum_{j=1}^mvarphi(j)sum_{k|gcd(a,j)}varphi(frac{a}{k})
    &=bsum_{k|a}^mvarphi(frac{a}{k})sum_{j=1}^{m/k}varphi(kj)
    &=bsum_{k|a}^mvarphi(frac{a}{k})f(k,frac{m}{k})
    end{aligned}$$
     边界(f(1,m)=sumlimits_{i=1}^mvarphi(i) , f(n,1)=varphi(n) , f(n,0)=0)
    (f(1,m)=sumlimits_{i=1}^mvarphi(i)),可以用杜教筛的方法在一次 (O(m^{frac{2}{3}})) 的时间复杂度内求出,
     同时,我们还记忆化了所有 (varphi(leftlfloor frac{m}{n} ight floor)) 的值,所以这个复杂度只需要计算一次。
     所以复杂度大概 (O(nsqrt{m}+m^{frac{2}{3}})) 算起来不太对但是跑得还挺快?

  • 相关阅读:
    Hadoop入门进阶课程12--Flume介绍、安装与应用案例
    Hadoop入门进阶课程11--Sqoop介绍、安装与操作
    Hadoop入门进阶课程10--HBase介绍、安装与应用案例
    Hadoop入门进阶课程9--Mahout介绍、安装与应用案例
    Hadoop入门进阶课程8--Hive介绍和安装部署
    Hadoop入门进阶课程7--Pig介绍、安装与应用案例
    zookeeper启动失败,但是状态显示已启动的原因
    微信小程序企业给零钱打款 提示未配置api发起,请查看产品中心企业付款配置
    java利用反射交换两个对象中的字段相同的字段值
    centos上 小程序部署 nginx+https+ssL 提示错误:对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2
  • 原文地址:https://www.cnblogs.com/mikufun-hzoi-cpp/p/12116575.html
Copyright © 2011-2022 走看看