1. 程式人生 > >一類尤拉函式相關的求和式推導

一類尤拉函式相關的求和式推導

\(\\\)

寫在前面


因為最近做了不少和尤拉函式相關的求和問題,而這一類求和的推導有沒有涉及到反演和卷積,所以單獨寫一寫。

給出的題目順序與難度大致無關,是按照個人做題的順序安排的。

再次宣告尤拉函式的定義:\(\varphi(x)\) 表示 \([1,x]\) 裡的所有整數中,與 \(x\) 互質的數的個數。

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

\(\\\)

尤拉函式的兩種常用求法


  • 公式法,單點複雜度 \(\sqrt n\) ,常用於少量求函式值

    \(n\) 質因數分解為 \(n=p_1^{k_1}\times p_2^{k_2}\times...\times p_m^{k_m}\)

    那麼有 \(\varphi(n)=n\times \frac{p_1-1}{p_1}\times \frac{p_2-1}{p_2}\times ...\times\frac{p_m-1}{p_m}\) ,複雜度顯然是質因數分解複雜度。

    注意複雜度分析的時候不能直接是 個數\(\times \sqrt n\) ,因為往往我們求的數並不全都是卡上限的。

  • 線性篩,複雜度線性,用於求一個不大的數域內全部的函式值。

\(\\\)

[ SDOI 2012 ] Longge的問題


給出一個 \(n\) ,求
\[ \sum_{i=1}^n\ (i,n) \]

  • \(n\le 2^{32}\)

注意到資料範圍非常大,這一類資料量我們通常考慮 \(\sqrt n\) 級別的做法。

首先有兩個顯然的性質:

  • 任意兩數的最大公約數首先要是這兩個數各自的約數,所以 \((i,n)\) 首先是 \(n\) 的約數

  • 任何一個數的約數是成對存在的,這也是試除法成立的前提

然後根據經典的做法,我們通常將相同的 \(gcd\) 提出來,對每一個因數考慮它被計算的次數,有
\[ \sum_{i=1}^n\ (i,n)=\sum_{d=1,d|n}^n \bigg(d\times \sum_{i=1}^n\ [(i,n)=d]\bigg)=\sum_{d=1,d|n}^n \bigg(d\times \sum_{i=1}^n\ [(\frac id,\frac nd)=1]\bigg) \]


然後按照經典的做法我們把變數上限改一下,得到
\[ \sum_{d=1,d|n}^n \bigg(d\times \sum_{i=1}^n\ [(\frac id,\frac nd)=1]\bigg)=\sum_{d=1,d|n}^n \bigg(d\times \sum_{i=1}^\frac nd\ [(i,\frac nd)=1]\bigg)=\sum_{d=1,d|n}^n \bigg(d\times \varphi(\frac nd)\bigg) \]
然後試除法求 \(n\) 的所有約數,單點求一下 \(\varphi\) 即可。

\(\\\)

[ SDOI 2008 ] 儀仗隊


給出一個 \(n\) ,求
\[ \sum_{i=1}^n\sum_{j=1}^n\ [(i,j)=1] \]

  • \(n\le 4\times 10^4\)

\(\\\)

考慮這是求一個\(n\times n\)的矩陣內,橫縱座標互質的點的個數。

先考慮縱座標小於橫座標的情況,那麼相當於求每一個橫座標有多少個小於其且與其互質的縱座標,有
\[ \sum_{i=1}^n \sum_{j=1}^i\ [(i,j)=1]=\sum_{i=1}^n\varphi(i) \]
那麼剩餘的部分顯然是縱座標大於橫座標的點,考慮將橫縱座標交換,有轉化成了剛才的式子。

此時我們對角線上的點都被重算了一次,但是除了 \((1,1)\) 點以外所有對角線上的點顯然橫縱座標並不互質
\[ ans=\bigg(\sum_{i=1}^n \varphi(i)\bigg)\times 2-1 \]

\(\\\)

[ BZOJ 2818 ] GCD


給出一個 \(n\) ,求
\[ \sum_{i=1}^n\sum_{j=1}^n\ [(i,j)\ is\ prime] \]

  • \(n\le 10^7\)

按照經典的做法我們先列舉 \(gcd\) 的值,式子變成
\[ \sum_{d=1,\ d\ is\ prime}^n\sum_{i=1}^n\sum_{j=1}^n\ [(i,j)=d]=\sum_d\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}\ [(i,j)=1] \]
發現後面的兩個求和號就變成了上一題。

線性處理尤拉函式,線性求字首和,再列舉 \(n\) 以內的質數,累加上其對應的答案就好。

\(\\\)

[ Luogu 2398 ] GCD SUM


給出一個 \(n\) ,求
\[ \sum_{i=1}^n\sum_{j=1}^n\ (i,j) \]

  • \(n\le 10^5\)

按照套路我們列舉 \((i,j)\) 是啥,放到式子的最前面,有
\[ \sum_{d=1}^nd\times\sum_{i=1}^n\sum_{j=1}^n\ [(i,j)=d]=\sum_{d=1}^nd\times \sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac nd\rfloor}\ [(i,j)=1] \]
然後後面的就是儀仗隊這個題了,最後線性掃幾遍就能得到答案。

\(\\\)

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


給出\(T\)\(n\) ,對每一個 \(n\)
\[ \sum_{i=1}^n\sum_{j=i+1}^n\ (i,j) \]

  • \(n\le 4\times10^6,T\le 2\times 10^4\)

這題邪死我了.......

開始的想法是錯誤的,想到了按照上一個題那樣把 \(d\) 提出來放到前面,然後發現多組詢問複雜度是
\[ \text O(N+T\sqrt N)\ /\ \text O(N\sqrt N+T) \]
並不優秀,具體實現的話是對詢問的數字單獨除法分塊。

不妨分析一下式子換一個角度。假入我們還是把問題放在一個\(n\times n\) 的矩陣上,那麼求的其實是直線 \(y=x\) 以上的所有整點裡,橫縱座標互質的點數。這個數目顯然是與直線 \(y=x\) 一下的橫縱座標互質的點數個數是相等的。

然後所求就轉化為
\[ \sum_{i=1}^n\sum_{j=1}^{i-1} (i,j) \]
我們設
\[ g[x]=\sum_{i=1}^{x-1}(i,x)=\sum_{d=1,d|x}^{x-1}\bigg(d\times\sum_{i=1}^{x-1}\ [(i,x)=d]\bigg)=\sum_{d=1,d|x}^{x-1} \bigg(d\times \varphi(\frac nd)\bigg) \]
答案就變成
\[ \sum_{i=1}^n g[i] \]
顯然這個求和是線性的,有了這個回答就是 \(\text 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\)個數中每任意兩個不同的數的最大公約數的和。

  • \(n\le 2\times10^6\)

稍微寫寫畫畫發現就是上面那道題....甚至只有一個詢問。

還有一種解法就是 GCD SUM 那道題的答案減掉 \(1....n\) 之後除以 \(2\)

\(\\\)

[ Luogu 3601 ] 簽到題


定義函式 \(f(x)\) 為小於等於 \(x\) 的數中與 \(x\) 不互質的數的個數。

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

  • \(0\le l\le r\le 10^{12},r-l\le10^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] \]

  • \(T\le3\times 10^5,n\le 10^6\)

看這麼彪悍的資料範圍....別想了 \(O(1)\) 回答吧。
\[ \sum_{i=1}^n\ [i,n]=\sum_{i=1}^n \frac{i\times n}{(i,n)}=n\times\sum_{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)\times n}{2} \]
證明是這樣的:

如果存在一個與 \(n\) 互質的數 \(x\) ,那麼 \(n-x\) 也與 \(n\) 互質,這由輾轉相除法就可以得到。

然後由於與 \(n\) 互質的數一定不是 \(n\) 的約數,所以這樣的數一定是按照上面的原則成對出現的。

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

然後所求就化為
\[ \sum_{d=1,d|n}^n\frac{\varphi(d)\times d}{2} \]
因為是要預處理所有的答案,就調和級數的做就好啦,每次列舉 \(x\) 的倍數,向倍數累加 \(\frac{\varphi(x)\times x}{2}\)