LCM
首先
\[\sum_{i=1}^{n}i=\dfrac{n*(n+1)}{2} \]\[\sum_{i=1}^{n}i^2=\dfrac{n*(n+1)*(2n+1)}{6} \]\[\sum_{i=1}^{n}i^3=(\sum_{i=1}^{n}i)^2 \]P3911 最小公倍数之和
\[\sum_{i=1}^{n}\sum_{j=1}^{n}lcm(A_i,A_j) \]观察值域,发现与 \(n\) 同阶,记 \(c_i\) 表示数字 i 出现次数。
\[\sum_{i=1}^{n}\sum_{j=1}^{n}lcm(i,j)*c_i*c_j \]\[\sum_{i=1}^{n}\sum_{j=1}^{n}\dfrac{i*j}{(i,j)}*c_i*c_j \]\[\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}\dfrac{i*j}{d}*c_i*c_j*[(i,j)=d] \]\[\sum_{d=1}^{n}d\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}i*j*c_{id}*c_{jd}*[(i,j)=1] \]\[\sum_{d=1}^{n}d\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}i*j*c_{id}*c_{jd}*\sum_{k|(i,j)}\mu(k) \]\[\sum_{d=1}^{n}d\sum_{k=1}^{\frac{n}{d}}\mu(k)*k^2*\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}i*j*c_{idk}*c_{jdk} \]设 \(T=dk\) 枚举 T
\[\sum_{T=1}^{n}T\sum_{k|T}\mu(k)*k*(\sum_{i=1}^{\frac{n}{T}}c_{iT}*i)^2 \]因为枚举 dk,而 k 是必须枚举的,所以可以省略掉 d。然后原来有 \(\sum_{d=1}^{n}d\),可以从后面找个 k 组成 T。
考虑枚举的是 \(T=dk\),所以一定有 \(k|T\).
最后预处理出 \(\sum_{k|T}\mu(k)*k\),暴力做\((\sum_{i=1}^{\frac{n}{T}}c_{iT}*i)^2\).
因为 \(\sum_{i=1}^{n}\frac{n}{i}\) 这样子是个调和级数的形式,所以后面暴力是 \(O(n \ln n)\)的。
\(\text{Code}\)
#include 
#include 
#include 
#include 
#define N (int)(5e4+5)
#define int long long
using namespace std;
bool vis[N];
int pri[N],mu[N],sum[N],cnt;
int n,a[N],c[N];
int rd() {
	int f=1,sum=0; char ch=getchar();
	while(!isdigit(ch)) {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)) {
		sum=(sum<<3)+(sum<<1)+ch-'0';
		ch=getchar();
	}
	return sum*f;
}
void pr(int x) {
	if(x<0) {
		putchar('-');
		x=-x;
	}
	if(x>9) pr(x/10);
	putchar(x%10+'0');
}
void get_mu() {
	mu[1]=1;
	for(int i=2;i<=N-5;i++) {
		if(!vis[i]) {
			mu[i]=-1;
			pri[++cnt]=i;
		}
		for(int j=1;j<=cnt&&pri[j]*i<=N-5;j++) {
			vis[pri[j]*i]=1;
			if(i%pri[j]==0) break;
			mu[pri[j]*i]=-mu[i];
		}
	}
}
signed main() {
	get_mu();
	n=rd(); int qwq=0;
	for(int i=1;i<=n;i++) {
		a[i]=rd(); qwq=max(qwq,a[i]);
		++c[a[i]];
	}
	for(int i=1;i<=qwq;i++)
		for(int j=i;j<=qwq;j+=i)
			sum[j]+=mu[i]*i;
	int ans=0;
	for(int T=1;T<=qwq;T++) {
		int ret=0;
		for(int i=1;i<=qwq/T;i++) ret+=i*c[i*T];
		ret*=ret;
		ans+=T*ret*sum[T];
		//cout<    
较为困难的LCM
\[\sum_{i=1}^{n}\sum_{j=1}^{n}lcm(i,j) \]\[n \le 10^{10} \]那么我们没办法用 \(O(n \ln n)\) 的办法了。
先化简下
\[\sum_{i=1}^{n}\sum_{j=1}^{n}\dfrac{i*j}{(i,j)} \]\[\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}\dfrac{i*j}{d}*[(i,j)=d] \]\[\sum_{d=1}^{n}d\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}i*j*[(i,j)=1] \] \[h(n)=\sum_{i=1}^{n}i*[(i,n)=1] \]这个东西就等于(实际上是我 oeis 出来的)
\[\dfrac{n*\phi(n)+[n=1]}{2} \]考虑证明下
已有 \(gcd(i,n)=1\).
若有一个数 \(d,(d\neq1)\) 使得 \(gcd(n,(n-i))=d.\)
那么 \(n\%d=0,(n-i)\%d=0\implies i\%d=0\)
那么 \(gcd(i,n)=d\).
所以可得,已有 \(gcd(i,n)=1 \implies gcd(n,(n-i))=1.\)
考虑 \(i,n-i\) 成对出现,且对答案贡献是 \(n\).
则去重后答案为 \(\dfrac{n*\phi(n)+[n=1]}{2}\).
那么
\[ans=\sum_{d=1}^{n}d\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}i*j*[(i,j)=1] \]\[\sum_{d=1}^{n}d\sum_{i=1}^{\frac{n}{d}}i*2*h(i)-1 \]\[\sum_{d=1}^{n}d\sum_{i=1}^{\frac{n}{d}}i*2*\dfrac{i*\phi(i)+[i=1]}{2}-1 \]\[\sum_{d=1}^{n}d\sum_{i=1}^{\frac{n}{d}}i^2*\phi(i) \]因为 \([i=1]\) 与 \(-1\) 抵消了。
\[S(n)=\sum_{i=1}^{n}i^2*\phi(i) \]那么
\[ans=\sum_{d=1}^{n}d*S(\frac{n}{d}) \] \[f(x)=x^2*\phi(x),g(x)=x^2. \]那么
\[(f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})=n^3 \]这里省略的可以在这里找到。
接下来就是杜教筛了。
最后整个 \(ans\) 来个整除分块。
\(\text{Code}\)
#include 
#include 
#include 
#include 
#include