BZOJ 2154 Crash的数字表格 (莫比乌斯反演)
Crash的數字表格
今天的數學課上,Crash小朋友學習了最小公倍數(Least Common Multiple)。對于兩個正整數a和b,LCM(a, b)表示能同時被a和b整除的最小正整數。例如,LCM(6, 8) = 24。回到家后,Crash還在想著課上學的東西,為了研究最小公倍數,他畫了一張NM的表格。每個格子里寫了一個數字,其中第i行第j列的那個格子里寫著數為LCM(i, j)。一個45的表格如下: 1 2 3 4 5 2 2 6 4 10 3 6 3 12 15 4 4 12 4 20 看著這個表格,Crash想到了很多可以思考的問題。不過他最想解決的問題卻是一個十分簡單的問題:這個表格中所有數的和是多少。當N和M很大時,Crash就束手無策了,因此他找到了聰明的你用程序幫他解決這個問題。由于最終結果可能會很大,Crash只想知道表格里所有數的和mod 20101009的值。
Input
輸入的第一行包含兩個正整數,分別表示N和M。
Output
輸出一個正整數,表示表格中所有數的和mod 20101009的值。
Sample Input
4 5
Sample Output
122
【數據規模和約定】
100%的數據滿足N, M ≤ 10^7。
題解
n < m
Ans=∑i=1n∑j=1mlcm(i,j)=∑i=1n∑j=1mijgcd(i,j)=∑d=1n∑i=1n∑j=1mijd[gcd(i,j)==d]=∑d=1n∑i=1n/d∑j=1m/dijd[gcd(i,j)==1]=∑d=1nd∑i=1n/d∑j=1m/dij[gcd(i,j)==1]令:Sum(n,m)=∑i=1n∑j=1mijf(x)=∑i=1n∑j=1mij[gcd(i,j)==x]g(x)=∑i=1n∑j=1mij[x∣gcd(i,j)]=x2∑i=1n/x∑j=1m/xij[1∣gcd(i,j)]=∑x∣dnf(d)則:f(x)=∑x∣dnμ(dx)g(d)f(1)=∑d=1nμ(d)d2Sum(nd,md)Ans=∑d=1nd∑i=1n/d∑j=1m/dij[gcd(i,j)==1]=∑d=1nd∑i=1n/dμ(i)i2Sum(nid,mid)\begin{aligned} Ans &= {\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)}\\ &={\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{gcd(i,j)}}\\ &={\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}ozvdkddzhkzd[gcd(i, j)==d]}\\ &={\sum_{d=1}^{n}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}{ijd}[gcd(i, j)==1]}\\ &={\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}{ij}[gcd(i, j)==1]}\\ 令:Sum(n,m) &={\sum_{i=1}^{n}\sum_{j=1}^{m}ij}\\ f(x) &= {\sum_{i=1}^{n}\sum_{j=1}^{m}ij[gcd(i,j)==x]}\\ g(x)&={\sum_{i=1}^{n}\sum_{j=1}^{m}ij[x|gcd(i,j)]}\\ &={x^2\sum_{i=1}^{n/x}\sum_{j=1}^{m/x}ij[1|gcd(i,j)]}\\ &={\sum_{x|d}^{n}f(d)}\\ 則:f(x)&={\sum_{x|d}^{n}\mu(\fracozvdkddzhkzd{x})g(d)}\\ f(1)&={\sum_{d=1}^{n}\mu(d)d^2{Sum(\frac{n}ozvdkddzhkzd,\frac{m}ozvdkddzhkzd)}}\\ Ans &={\sum_{d=1}^{n}d\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}{ij}[gcd(i, j)==1]}\\ &=\sum_{d=1}^{n}d{\sum_{i=1}^{n/d}\mu(i)i^2{Sum(\frac{n}{id},\frac{m}{id})}}\\ \end{aligned} Ans令:Sum(n,m)f(x)g(x)則:f(x)f(1)Ans?=i=1∑n?j=1∑m?lcm(i,j)=i=1∑n?j=1∑m?gcd(i,j)ij?=d=1∑n?i=1∑n?j=1∑m?dij?[gcd(i,j)==d]=d=1∑n?i=1∑n/d?j=1∑m/d?ijd[gcd(i,j)==1]=d=1∑n?di=1∑n/d?j=1∑m/d?ij[gcd(i,j)==1]=i=1∑n?j=1∑m?ij=i=1∑n?j=1∑m?ij[gcd(i,j)==x]=i=1∑n?j=1∑m?ij[x∣gcd(i,j)]=x2i=1∑n/x?j=1∑m/x?ij[1∣gcd(i,j)]=x∣d∑n?f(d)=x∣d∑n?μ(xd?)g(d)=d=1∑n?μ(d)d2Sum(dn?,dm?)=d=1∑n?di=1∑n/d?j=1∑m/d?ij[gcd(i,j)==1]=d=1∑n?di=1∑n/d?μ(i)i2Sum(idn?,idm?)?
- μ(i)i2\mu(i)i^2μ(i)i2用前綴和預處理
求f(x}的時候用分塊可以在n{\sqrt{n}}n?完成
求Sum(x,y)的時候用分塊也可以在n{\sqrt{n}}n?完成
所以一次詢問可以在O(n)的時間解決 - 如果是多次詢問(10000次詢問)
需要繼續化簡
令T=id,考慮對T進行分塊Ans=∑d=1nd∑i=1n/dμ(i)i2Sum(nT,mT)=∑T=1nSum(nT,mT)∑i∣Tnμ(i)i2Ti\begin{aligned} 令T&=id,考慮對T進行分塊\\ Ans &=\sum_{d=1}^{n}d{\sum_{i=1}^{n/d}\mu(i)i^2{Sum(\frac{n}{T},\frac{m}{T})}}\\ &={\sum_{T=1}^{n}Sum(\frac{n}{T}, \frac{m}{T})\sum_{i|T}^{n}\mu(i)i^2\frac{T}{i}} \end{aligned} 令TAns?=id,考慮對T進行分塊=d=1∑n?di=1∑n/d?μ(i)i2Sum(Tn?,Tm?)=T=1∑n?Sum(Tn?,Tm?)i∣T∑n?μ(i)i2iT?? - ∑i∣Tnμ(i)i2Ti\sum_{i|T}^{n}\mu(i)i^2\frac{T}{i}∑i∣Tn?μ(i)i2iT?是積性函數可以用線性篩預處理,令t = i × prime[j]
- 線性篩的時候如果i % prime[j] = 0,則t對應的莫比烏斯函數為0,prime[j]的貢獻為g[i] * prime[j]
- i % prime[j] != 0,符合積形函數直接相乘
- i 為素數,g[i]=i?i2g[i] = i - i^2g[i]=i?i2
Sum(x,y)可以在n\sqrt{n}n?完成
總結
以上是生活随笔為你收集整理的BZOJ 2154 Crash的数字表格 (莫比乌斯反演)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ-2440 (莫比乌斯函数)
- 下一篇: Manacher 最长回文子串