• 公式推♂倒题


    公式推♂倒题

    国内ICPC中经常出现的一类问题!一般会给一个复杂度炒鸡吓人的式子,然后我们需要大力推倒他。把复杂度降到Accepted的范围。

    一些前置技能点总结

    跳跳狗

    ([frac{n}{i}])可以取到的值,个数是(O(sqrt n))级别的。

    int nex=1;
    for(int i=1;i<=n;i=nex+1) {
    	nex=n/(n/i); // 对于[i,nex]区间内所有数字x,n/x相等。
    }
    

    如果需要计算,(sum_{i=1}^{n} [frac{n}{i}])这种东西,我们就可以把([frac{n}{i}])相同的(i),放在一起处理。


    莫比乌斯函数

    这个东西本身上就是容斥吖!一个经典的式子:(sum_{d|n} mu(d) = [n=1])

    我们,把(n)分解质因子拆了(n=p_1^{a_1}p_2^{a_2}p_3^{a_3}...p_k^{a_k})

    我们考虑(n)的因子(d),如果(mu(d))不为0,那么每个质因子在(d)里面的指数,要么是0,要么是1.

    如果(d)包含奇数个质因子,那么(mu(d)=-1), 否则(mu(d)=1).

    • 所以(mu(d)=-1)(d)(C(k,1)+C(k,3)+....)个。
    • 所以(mu(d)=+1)(d)(C(k,0)+C(k,2)+....)个。

    根据((1-1)^k)二项式定理的展开,当(n)不为1时,(sum_{d|n} mu(d)=0)

    当然这个式子是可以进化的。

    我们用类似的方法,同样也可以得到(sum_{d^2|n} mu(d) = mu(n)^2)

    推倒的姿势

    姿势1:考虑一下公因子,质因子什么的

    按因子统计的问题。出现得相当多了。

    栗子1:给出(n(nleq2000000)),计算:

    (sum_{i=1}^{n} sum_{j=1}^{n} gcd(i,j))

    做法:

    我们按照gcd分类一下可化成。(sum_{g=1}^{n}(gsum_{i=1}^{n/g}sum_{j=1}^{n/g} [gcd(i,j)=1]))

    (f(x)=sum_{i=1}^{x}sum_{j=1}^{x} [gcd(i,j)=1] = sum_{d=1}^{x} mu(d)(frac{x}{d})^2)

    (f(x))可以按照(frac{x}{d})分类,使用跳跳狗来分块计算,复杂度(O(sqrt x)),原式 = (sum_{g=1}^{n} g*f(frac{n}{g})),按照(frac{n}{g})的值使用跳跳狗分块计算即可。

    栗子2: 2018沈阳网络赛C

    做法:

    式子可化为(sum_{i=1}^{n}sum_{j=1}^{i} j^2mu(j)^2 = sum_{i=1}^{n}sum_{j=1}^{i}j^2sum_{d^2|j}mu(d))

    交换求和顺序,枚举d,式子可化为(sum_{d=1}^{sqrt n}sum_{j=1}^{frac{n}{d^2}}(n-d^2j+1)(d^2j)^2)

    难看死了,整理一下(sum_{d=1}^{sqrt n}[((n+1)d^4sum_{j=1}^{frac{n}{d^2}}j^2)-(d^6sum_{j=1}^{frac{n}{d^2}}j^3)])

    中括号里的那个吓死人的东西,其实可以(O(1))计算哎!于是我们就施展开了。

    然后注意一下:

    • 首先这个题要用快速乘!
    • 然后(frac{x}{y}\%p = frac{x\%(yp)}{y}) [很好推的啦!]

    栗子3: SDOI2015约数个数和

    我们要求(sum_{i=1}^{n}sum_{j=1}^{m}d(ij))

    按公因子分类,化为(sum_{g=1}^{n}d(g)sum_{i=1}^{n/g}sum_{j=1}^{m/g} d(i)d(j)[gcd(i,j)=1])

    对着(sum_{i=1}^{n/g}sum_{j=1}^{m/g} d(i)d(j)[gcd(i,j)=1])施展莫比乌斯反演可转化为一个辣鸡,所以这条路GG了。

    真做法:

    考虑如下这个式子,(d(ij)=sum_{u|i}sum_{v|j}[gcd(u,v)=1])

    为什么成立呢?我们考虑质因子(p)(i,j)中的指数。设(p)(i)中出现(a_1)次,在(j)中出现(a_2)次,那么(p)(i*j)的因子中就会有(a_1+a_2+1)种选择。然后我们考虑等式右边,当(gcd(u,v)=1),设(u)(p)的指数为(b_1)(v)(p)的指数为(b_2),那么(b_1=0)或者(b_2=0), 合法的有序对((b_1,b_2))共有(a_1+a_2+1)个。然后,每种质因子相互独立。所以等式是成立的。

    然后这个问题就简单了。不妨设(n<m)

    原式 = (sum_{i=1}^{n}sum_{j=1}^{m}sum_{u|i}sum_{v|j} [gcd(u,v)=1])

    交换求和顺序得 (sum_{u=1}^{n}sum_{v=1}^{m} [frac{n}{u}] [frac{m}{v}] [gcd(u,v)=1])

    施展莫比乌斯反演得(sum_{d=1}^{n} mu(d) sum_{i=1}^{n/d}sum_{j=1}^{m/d}frac{n/d}{i}frac{m/d}{j} = sum_{d=1}^{n} mu(d) (sum_{i=1}^{n/d}frac{n/d}{i})(sum_{j=1}^{m/d}frac{m/d}{j}))

    施展跳跳狗分块,即可。

    栗子4: ZOJ3881

    做法:

    • 先观察到(f(x))是积性函数,然后(g(n)=sum_{d|n}f(d))也是积性函数。
    • (g(n)=(p_1^{a_1}+1)(p_2^{a_2}+1)(p_3^{a_3}+1).....) 【喵】
    • 展开(g(n))我们可以发现,(g(n)=sum_{d|n} d[gcd(d,n/d)=1])
    • (sum_{i=1}^{n} g(i) = sum_{i=1}^{n}sum_{d|i}d[gcd(d,i/d)=1])
    • 按照(gcd(d,n/d))的值,进行容斥有(sum_{g=1}^{sqrt n}mu(g)sum_{i=1}^{n/g^2}i*[frac{n/g^2}{i}])
    • 跳跳狗分块即可。复杂度(O(sqrt nlog(sqrt n)))

    【喵】:这个地方,还是打表来得舒适。接下来我们来推一推。

    • 考虑质数(p),(g(p)=p+1),(g(p^k)=p^k+1)
    • 根据积性函数的性质,证完了。【积性函数太好用了!】【口胡.jpg】

    姿势2:杜教筛

  • 相关阅读:
    线程带参数操作
    静态页面不识别include
    当网站遭遇DDOS攻击的解决方案及展望
    带进度条上传控件
    用js实现了表格数据管理的以下几个功能:
    怎么面试一个人
    map的使用
    在Axapta中实现trim函数
    Axapta财务过账分析(一)
    在Axapta中实现split函数
  • 原文地址:https://www.cnblogs.com/RUSH-D-CAT/p/9634568.html
Copyright © 2020-2023  润新知