【BZOJ】2154: Crash的數字表格


http://www.lydsy.com/JudgeOnline/problem.php?id=2154

題意:求$\sum_{i=1}^{n} \sum_{j=1}^{m} lcm(i, j)$, $n,m<=1e7$

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=1e7+10, MD=20101009;
int p[N], pcnt, n, m;
bool np[N];
ll g[N];
void init() {
	g[1]=1;
	int i, j, t;
	for(i=2; i<=n; ++i) {
		if(!np[i]) p[++pcnt]=i, g[i]=1-i;
		for(j=1; j<=pcnt; ++j) {
			t=p[j]*i; if(t>n) break;
			np[t]=1;
			if(i%p[j]==0) { g[t]=g[i]; break; }
			g[t]=g[i]*(1-p[j]);
		}
	}
	for(i=2; i<=n; ++i) g[i]*=i;
	for(i=1; i<=n; ++i) g[i]+=g[i-1], g[i]%=MD;
}
int main() {
	scanf("%d%d", &n, &m); if(n>m) swap(n, m);
	init();
	ll ans=0, t1, t2;
	for(int i=1, pos=0; i<=n; i=pos+1) {
		pos=min(n/(n/i), m/(m/i));
		t1=((ll)(n/i)*(n/i+1)/2)%MD;
		t2=((ll)(m/i)*(m/i+1)/2)%MD;
		ans+=((g[pos]-g[i-1])*((t1*t2)%MD))%MD;
		ans%=MD;
	}
	printf("%lld\n", ((ans%MD)+MD)%MD);
	return 0;
}

  

吐槽:

媽媽我再也不相信科學了QAQ..............這種題各種不知道哪里爆+各種不知道哪里爆讓我十分蛋疼QAQ

sb錯1:忘記最后除法不一定是整數QAQ,那么一定要在中途能保證是整數的就算出來啊= =后邊算不出來的啊喂。。

sb錯2:各種爆longlong讓我十分無語,取太多mod又會很慢= =(看來為了保險起見...以后哪里要mod就mod...不要亂估計啦。。。

然后不明覺厲...為何我查詢已經做到$O(n^{0.5} + m^{0.5})$了,還是那么慢?那些200多ms的是什么神做法QAQ難道是分塊打表了嗎QAQ

本題很惡心,為了推出$O(n^{0.5} + m^{0.5})$的查詢我推了十分鍾,然后各種wa以為是推錯了QAQ原來是精度,媽媽壓。。。

 

(我真的有不想寫推導公式的過程的沖動QAQ

下邊均設$n<=m$

$$\sum_{i=1}^{n} \sum_{j=1}^{m} lcm(i, j) = \sum_{i=1}^{n} \sum_{j=1}^{m} \frac{ij}{(i,j)} $$

然后我們要想枚舉$d=(i,j)$,那么就要確定$ij$怎么取,顯然我們只需要先除去$i$和$j$的$d$,也就是$(i/d,j/d)=1$就行了,那么設

$$F(x, y) = \sum_{i=1}^{x} \sum_{j=1}^{y} ij[(i,j)=1]$$

那么原式變成

$$
\sum_{d=1}^{n} \frac{d^2 F(\lfloor \frac{n}{d} \rfloor, \lfloor \frac{m}{d} \rfloor)}{d} = \sum_{d=1}^{n} d F(\lfloor \frac{n}{d} \rfloor, \lfloor \frac{m}{d} \rfloor)
$$

考慮求$F(x,y)$

$$
\begin{align}
F(x, y) & = \sum_{i=1}^{x} \sum_{j=1}^{y} ij[(i,j)=1] \\
& = \sum_{i=1}^{x} \sum_{j=1}^{y} ij \sum_{d|(i,j)} \mu (d) \\
& = \sum_{d=1}^{x} \mu (d) \sum_{d|i}^{x} i \sum_{d|j}^{y} j \\
& = \sum_{d=1}^{x} \mu (d) d^2 \sum_{i=1}^{\lfloor \frac{x}{d} \rfloor} i \sum_{j=1}^{\lfloor \frac{y}{d} \rfloor} j \\
& = \sum_{d=1}^{x} \mu (d) d^2 \frac{\lfloor \frac{x}{d} \rfloor (\lfloor \frac{x}{d} \rfloor +1)}{2} \frac{\lfloor \frac{y}{d} \rfloor (\lfloor \frac{y}{d} \rfloor +1)}{2} \\
\end{align}
$$

帶回原式得

$$
\begin{align}
& \sum_{d=1}^{n} d F(\lfloor \frac{n}{d} \rfloor, \lfloor \frac{m}{d} \rfloor) \\
= & \sum_{d=1}^{n} d \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \mu (i) i^2 \frac{\lfloor \frac{\lfloor \frac{n}{d} \rfloor}{i} \rfloor (\lfloor \frac{\lfloor \frac{n}{d} \rfloor}{i} \rfloor +1)}{2} \frac{\lfloor \frac{\lfloor \frac{m}{d} \rfloor}{i} \rfloor (\lfloor \frac{\lfloor \frac{m}{d} \rfloor}{i} \rfloor +1)}{2} \\
= & \sum_{d=1}^{n} d \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \mu (i) i^2 \frac{\lfloor \frac{n}{di} \rfloor (\lfloor \frac{n}{di} \rfloor +1)}{2} \frac{\lfloor \frac{m}{di} \rfloor (\lfloor \frac{m}{di} \rfloor +1)}{2} \\
\end{align}
$$

現在已經可以$O(\sqrt n \sqrt n) = O(n)$單次查詢了,但是不夠理想,我們繼續化簡

令$T=di$,則$i|T, d=T/i$,換掉指標,得

$$
\begin{align}
& \sum_{d=1}^{n} d \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \mu (i) i^2 \frac{\lfloor \frac{n}{di} \rfloor (\lfloor \frac{n}{di} \rfloor +1)}{2} \frac{\lfloor \frac{m}{di} \rfloor (\lfloor \frac{m}{di} \rfloor +1)}{2} \\
= &
\sum_{T=1}^{n} \frac{\lfloor \frac{n}{T} \rfloor (\lfloor \frac{n}{T} \rfloor +1)}{2} \frac{\lfloor \frac{m}{T} \rfloor (\lfloor \frac{m}{T} \rfloor +1)}{2} \sum_{i|T} \frac{T}{i} \mu (i) i^2 \\
= & \sum_{T=1}^{n} \frac{\lfloor \frac{n}{T} \rfloor (\lfloor \frac{n}{T} \rfloor +1)}{2} \frac{\lfloor \frac{m}{T} \rfloor (\lfloor \frac{m}{T} \rfloor +1)}{2} T \sum_{i|T} \mu (i) i \\
\end{align}
$$

設$g(T)=T \sum_{i|T} \mu (i) i$,我們再設$f(T)=\sum_{i|T} \mu (i) i$那么$g(T)=Tf(T)$,考慮求$f(T)$

在線性篩中,外層為$k$,內層為$p_y$,所以求$f(kp_y)=\sum_{i|kp_y} \mu(i) i$
當$p_y|k$時
當$i$取的數的因子中不包含新加入的$p_y$時,答案就是$f(k)$
當$i$取包含新加入的因子$p_y$時,由於此時$p_y$指數已經$>=2$,所以$\mu (i)=0$,因此貢獻為0
綜上,當$p_y|k$時,答案為$f(k)$

當$p_y \nmid k$時
當$i$取的數的因子中不包含新加入的$p_y$時,同上,答案是$f(k)$
當$i$取的數的因子包含新加入的$p_y$時,由於指數為$1$,所以我們考慮$i=ap_y$,原式變為

$$
\begin{align}
& \sum_{i|T} \mu(i) i \\
= & \sum_{ap_y|kp_y} \mu (ap_y) ap_y \\
= & p_y \sum_{a|k} \mu (a) \mu(p_y) a \\
= & -p_y \sum_{a|k} \mu(a) a \\
= & -p_y f(k) \\
\end{align}
$$

綜上,當$p_y \nmid k$時,答案為$(1-p_y)f(k)$

然后線性篩隨便搞搞即可,最后答案就是

$$\sum_{T=1}^{n} \frac{\lfloor \frac{n}{T} \rfloor (\lfloor \frac{n}{T} \rfloor +1)}{2} \frac{\lfloor \frac{m}{T} \rfloor (\lfloor \frac{m}{T} \rfloor +1)}{2} g(T) $$

分塊搞搞就行了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM