zoukankan      html  css  js  c++  java
  • 一类欧拉函数相关的求和式推导

    (\)

    写在前面


    因为最近做了不少和欧拉函数相关的求和问题,而这一类求和的推导有没有涉及到反演和卷积,所以单独写一写。

    给出的题目顺序与难度大致无关,是按照个人做题的顺序安排的。

    再次声明欧拉函数的定义:(varphi(x)) 表示 ([1,x]) 里的所有整数中,与 (x) 互质的数的个数。

    下面的叙述中均用 ((x,y)) 表示 (gcd(x,y)) ,用 ([x,y]) 表示 (lcm(x,y))

    (\)

    欧拉函数的两种常用求法


    • 公式法,单点复杂度 (sqrt n) ,常用于少量求函数值

      (n) 质因数分解为 (n=p_1^{k_1} imes p_2^{k_2} imes... imes p_m^{k_m})

      那么有 (varphi(n)=n imes frac{p_1-1}{p_1} imes frac{p_2-1}{p_2} imes ... imesfrac{p_m-1}{p_m}) ,复杂度显然是质因数分解复杂度。

      注意复杂度分析的时候不能直接是 个数( imes sqrt n) ,因为往往我们求的数并不全都是卡上限的。

    • 线性筛,复杂度线性,用于求一个不大的数域内全部的函数值。

    (\)

    [ SDOI 2012 ] Longge的问题


    给出一个 (n) ,求

    [sum_{i=1}^n (i,n) ]

    • (nle 2^{32})

    注意到数据范围非常大,这一类数据量我们通常考虑 (sqrt n) 级别的做法。

    首先有两个显然的性质:

    • 任意两数的最大公约数首先要是这两个数各自的约数,所以 ((i,n)) 首先是 (n) 的约数

    • 任何一个数的约数是成对存在的,这也是试除法成立的前提

    然后根据经典的做法,我们通常将相同的 (gcd) 提出来,对每一个因数考虑它被计算的次数,有

    [sum_{i=1}^n (i,n)=sum_{d=1,d|n}^n igg(d imes sum_{i=1}^n [(i,n)=d]igg)=sum_{d=1,d|n}^n igg(d imes sum_{i=1}^n [(frac id,frac nd)=1]igg) ]

    然后按照经典的做法我们把变量上限改一下,得到

    [sum_{d=1,d|n}^n igg(d imes sum_{i=1}^n [(frac id,frac nd)=1]igg)=sum_{d=1,d|n}^n igg(d imes sum_{i=1}^frac nd [(i,frac nd)=1]igg)=sum_{d=1,d|n}^n igg(d imes varphi(frac nd)igg) ]

    然后试除法求 (n) 的所有约数,单点求一下 (varphi) 即可。

    (\)

    [ SDOI 2008 ] 仪仗队


    给出一个 (n) ,求

    [sum_{i=1}^nsum_{j=1}^n [(i,j)=1] ]

    • (nle 4 imes 10^4)

    (\)

    考虑这是求一个(n imes n)的矩阵内,横纵坐标互质的点的个数。

    先考虑纵坐标小于横坐标的情况,那么相当于求每一个横坐标有多少个小于其且与其互质的纵坐标,有

    [sum_{i=1}^n sum_{j=1}^i [(i,j)=1]=sum_{i=1}^nvarphi(i) ]

    那么剩余的部分显然是纵坐标大于横坐标的点,考虑将横纵坐标交换,有转化成了刚才的式子。

    此时我们对角线上的点都被重算了一次,但是除了 ((1,1)) 点以外所有对角线上的点显然横纵坐标并不互质

    [ans=igg(sum_{i=1}^n varphi(i)igg) imes 2-1 ]

    (\)

    [ BZOJ 2818 ] GCD


    给出一个 (n) ,求

    [sum_{i=1}^nsum_{j=1}^n [(i,j) is prime] ]

    • (nle 10^7)

    按照经典的做法我们先枚举 (gcd) 的值,式子变成

    [sum_{d=1, d is prime}^nsum_{i=1}^nsum_{j=1}^n [(i,j)=d]=sum_dsum_{i=1}^{lfloorfrac nd floor}sum_{j=1}^{lfloorfrac nd floor} [(i,j)=1] ]

    发现后面的两个求和号就变成了上一题。

    线性处理欧拉函数,线性求前缀和,再枚举 (n) 以内的质数,累加上其对应的答案就好。

    (\)

    [ Luogu 2398 ] GCD SUM


    给出一个 (n) ,求

    [sum_{i=1}^nsum_{j=1}^n (i,j) ]

    • (nle 10^5)

    按照套路我们枚举 ((i,j)) 是啥,放到式子的最前面,有

    [sum_{d=1}^nd imessum_{i=1}^nsum_{j=1}^n [(i,j)=d]=sum_{d=1}^nd imes sum_{i=1}^{lfloorfrac nd floor}sum_{j=1}^{lfloorfrac nd floor} [(i,j)=1] ]

    然后后面的就是仪仗队这个题了,最后线性扫几遍就能得到答案。

    (\)

    [ Uva 11426 / 11424 / 11417 / SPOJ 3871 ] GCD Extreme


    给出(T)(n) ,对每一个 (n)

    [sum_{i=1}^nsum_{j=i+1}^n (i,j) ]

    • (nle 4 imes10^6,Tle 2 imes 10^4)

    这题邪死我了.......

    开始的想法是错误的,想到了按照上一个题那样把 (d) 提出来放到前面,然后发现多组询问复杂度是

    [ ext O(N+Tsqrt N) / ext O(Nsqrt N+T) ]

    并不优秀,具体实现的话是对询问的数字单独除法分块。

    不妨分析一下式子换一个角度。假入我们还是把问题放在一个(n imes n) 的矩阵上,那么求的其实是直线 (y=x) 以上的所有整点里,横纵坐标互质的点数。这个数目显然是与直线 (y=x) 一下的横纵坐标互质的点数个数是相等的。

    然后所求就转化为

    [sum_{i=1}^nsum_{j=1}^{i-1} (i,j) ]

    我们设

    [g[x]=sum_{i=1}^{x-1}(i,x)=sum_{d=1,d|x}^{x-1}igg(d imessum_{i=1}^{x-1} [(i,x)=d]igg)=sum_{d=1,d|x}^{x-1} igg(d imes varphi(frac nd)igg) ]

    答案就变成

    [sum_{i=1}^n g[i] ]

    显然这个求和是线性的,有了这个回答就是 ( ext O(1)) 的。

    然后就只需要考虑 (g[x]) 的求法。

    其实也可以像 天守阁的地板 那道题一样用调和级数复杂度去做。

    但是注意到每个数不计算自己作为 (gcd) 的贡献,所以我们枚举倍数的时候直接从 (2) 倍开始就可以了。

    for(R int i=1;i<N;++i)
        for(R int j=i*2;j<N;j+=i) ans[j]+=(ll)i*phi[j/i];
      for(R int i=1;i<=N;++i) ans[i]+=ans[i-1];
    

    (\)

    [ Luogu 1390 ] 公约数的和


    给出一个 (n) ,求这(n)个数中每任意两个不同的数的最大公约数的和。

    • (nle 2 imes10^6)

    稍微写写画画发现就是上面那道题....甚至只有一个询问。

    还有一种解法就是 GCD SUM 那道题的答案减掉 (1....n) 之后除以 (2)

    (\)

    [ Luogu 3601 ] 签到题


    定义函数 (f(x)) 为小于等于 (x) 的数中与 (x) 不互质的数的个数。

    给出 (l,r) ,求

    [sum_{i=l}^r f(i)\%66623333 ]

    • (0le lle rle 10^{12},r-lle10^6)

    幌子比较明显......显然 (f(x)=x-varphi(x)) 然后就是两个求和减一下,前面是等差数列,我们只关心后一个。

    [sum_{i=l}^r varphi(i) ]

    显然线性筛不能筛这么大数据范围,所以需要单点求欧拉函数值。

    考虑对每一个数质因数分解复杂度还是过高,所以考虑每一个因数的影响。

    显然区间里的 (x) 的倍数只有 (frac{len}{x}) 个,所以复杂度调和级数,枚举倍数然后更新一下就好了。

    最后判断一下区间里的每一个数是否变成 (1) 了,若没有就再算一次即可。

    for(R ll i=1;i<=prm[0];++i){
    	ll val=prm[i];
    	for(R ll j=(val-l%val)%val;j<=r-l;j+=val){
    		phi[j]=(phi[j]/val)*(val-1);
    		while(fac[j]%val==0) fac[j]/=val;
    	}
    }
    

    (\)

    [ SPOJ 5971 ] LCMSUM


    (T)组数据,每组给出一个 (n) ,求

    [sum_{i=1}^n [i,n] ]

    • (Tle3 imes 10^5,nle 10^6)

    看这么彪悍的数据范围....别想了 (O(1)) 回答吧。

    [sum_{i=1}^n [i,n]=sum_{i=1}^n frac{i imes n}{(i,n)}=n imessum_{i=1}^n frac{i}{(i,n)} ]

    然后我们就只关心后面这个求和了。照例把 (gcd) 枚举一下

    [sum_{i=1}^n frac{i}{(i,n)}=sum_{d=1,d|n}^n sum_{i=1}^n frac id[(i,n)=d]=sum_{d=1,d|n}^n sum_{i=1}^{frac nd} i [(i,frac nd)=1] ]

    第二个等号就是把限制条件扔到了求和上限上,注意求和的对象也在变。

    然后我们知道,(d)(frac nd) 是成对出现的,所以可以把 (frac nd) 替换一下

    [sum_{d=1,d|n}^n sum_{i=1}^{frac nd} i [(i,frac nd)=1]=sum_{d=1,d|n}^n sum_{i=1}^d i [(i,d)=1] ]

    然后后面这个求和号就是与 (d) 互质的数的和对吧。

    有一个神奇的等式

    [sum_{i=1}^n i [(i,n)=1]=frac{varphi(n) imes n}{2} ]

    证明是这样的:

    如果存在一个与 (n) 互质的数 (x) ,那么 (n-x) 也与 (n) 互质,这由辗转相除法就可以得到。

    然后由于与 (n) 互质的数一定不是 (n) 的约数,所以这样的数一定是按照上面的原则成对出现的。

    每一对的和是 (n) ,一共有 (frac {varphi(n)}2) 对。

    然后所求就化为

    [sum_{d=1,d|n}^nfrac{varphi(d) imes d}{2} ]

    因为是要预处理所有的答案,就调和级数的做就好啦,每次枚举 (x) 的倍数,向倍数累加 (frac{varphi(x) imes x}{2})

  • 相关阅读:
    《大话数据结构》第9章 排序 9.9 快速排序(下)
    [HTML5 DOM] dispatchEvent
    [AWS SAP] Exam Tips 2 Continues Improvement for Existing Solutions
    遇见C++ PPL:C++ 的并行和异步
    遇见C++ AMP:在GPU上做并行计算
    遇见C++ Lambda
    遇见C++ AMP:GPU的线程模型和内存模型
    服务器推技术
    转http状态码
    extjs同步与异步请求互换
  • 原文地址:https://www.cnblogs.com/SGCollin/p/9909276.html
Copyright © 2011-2022 走看看