AT_agc038_c LCMs 题解

  • 给定一个长度为 \(N\) 的数列 \(A_1, A_2, A_3, \ldots, A_N\)
  • 请你求出 \(\sum_{i=1}^{N}\sum_{j=i+1}^{N}\mathrm{lcm}(A_i,A_j)\) 的值模 \(998244353\) 的结果。
  • \(1 \leq N \leq 2 \times 10^5\)\(1 \leq A_i \leq 10^6\)

\(M=A_{Max}\)

首先,第二个 \(\sum\) 的下标不从 \(1\) 让我们的推演举步维艰。因为 \(lcm\) 是对称的,所以我们可以算两个完整的 \(\sum\),再减去对角线、除以 \(2\) 得到答案。即:

\[\sum_{i=1}^{N}\sum_{j=i+1}^{N}lcm(A_i,A_j) =\dfrac{\sum_{i=1}^{N}\sum_{j=1}^{N}lcm(A_i,A_j)-\sum_{i=1}^{N}lcm(A_i,A_i)}{2}\\ =\dfrac{\sum_{i=1}^{N}\sum_{j=1}^{N}lcm(A_i,A_j)-\sum_{i=1}^{N}A_i}{2}\\ \]

发现 \(\sum_{i=1}^{N}lcm(A_i,A_i)\) 就是 \(A\) 数组的和。输入的时候记录一下即可。

\[\sum_{i=1}^{N}\sum_{j=1}^{N}lcm(A_i,A_j)\\ =\sum_{i=1}^{N}\sum_{j=1}^{N}\dfrac{A_iA_j}{gcd(A_i,A_j)}\\ =\sum_g^M\sum_{i=1}^{N}\sum_{j=1}^{N}\dfrac{A_iA_j}{g}[gcd(A_i,A_j)=g]\\ =\sum_g^M\dfrac{1}{g}\sum_{i=1}^{N}\sum_{j=1}^{N}A_iA_j[gcd(A_i,A_j)=g][g|A_i][g|A_j]\\ =\sum_g^M\dfrac{1}{g}\sum_{i=1}^{N}\sum_{j=1}^{N}A_iA_j[gcd(\frac{A_i}{g},\frac{A_j}{g})=1][g|A_i][g|A_j]\\ =\sum_g^M\dfrac{1}{g}\sum_{i=1}^{N}\sum_{j=1}^{N}A_iA_j[g|A_i][g|A_j][gcd(\frac{A_i}{g},\frac{A_j}{g})=1]\\ =\sum_g^M\dfrac{1}{g}\sum_{i=1}^{N}\sum_{j=1}^{N}A_iA_j[g|A_i][g|A_j]\sum_{d|gcd(\frac{A_i}{g},\frac{A_j}{g})}\mu(d)\\ =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}\sum_{i=1}^{N}\sum_{j=1}^{N}A_iA_j[g|A_i][g|A_j][d|gcd(\frac{A_i}{g},\frac{A_j}{g})]\\ =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}\sum_{i=1}^{N}\sum_{j=1}^{N}A_iA_j[g|A_i][g|A_j][d|A_i][d|A_j]\\ =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}\sum_{i=1}^{N}\sum_{j=1}^{N}A_iA_j[gd|A_i][gd|A_j]\\ =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}\sum_{i=1}^{N}[gd|A_i]A_i\sum_{j=1}^{N}A_j[gd|A_j]\\ =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}\left(\sum_{i=1}^{N}[gd|A_i]A_i\right)^2\\ =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}\left(\sum_{i=1}^{N}[gd|A_i]A_i\right)^2\\ \]

\(c_i\) 表示输入的 \(A\) 数组中含有 \(c_i\)\(i\),则显然下式成立:

\[\sum_{i=1}^{N}[gd|A_i]A_i=\sum_{gd|i}^Mi\times c_i \]

所以原式:

\[Ans =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}\left(\sum_{i=1}^{N}[gd|A_i]A_i\right)^2\\ =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}\left(\sum_{gd|i}^Mi\times c_i\right)^2\\ \]

设函数 \(f(x)=\sum_{x|i}^Mi\times c_i\),则原式:

\[Ans =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}\left(\sum_{gd|i}^Mi\times c_i\right)^2\\ =\sum_g^M\sum_{d}^{\frac{M}{g}}\dfrac{\mu(d)}{g}f^2(gd)\\ \]

\(f\) 可以在 \(O(n\ln{n})\) 的复杂度内预处理出来,剩下的又是个 \(O(n\ln{n})\) 的暴力,直接计算即可。
注意到有除法操作,需要线性求逆元。线性求逆元公式:

\[inv_i=\left(-\lfloor\dfrac{p}{i}\rfloor\times inv_{p \bmod i}\right) \bmod p \]


代码:

// Problem: AT_agc038_c [AGC038C] LCMs
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/AT_agc038_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define INF 0x7fffffff
#define MAXN 1000005
#define eps 1e-9
#define foru(a,b,c)	for(int a=b;a<=c;a++)
#define RT return 0;
#define db(x)	cout<<endl<<x<<endl;
#define LL long long
#define int LL
#define LXF int
#define RIN rin()
#define HH printf("\n")
using namespace std;
inline LXF rin(){
	LXF x=0,w=1;
	char ch=0;
	while(ch<'0'||ch>'9'){ 
	if(ch=='-') w=-1;
	ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
	x=x*10+(ch-'0');
	ch=getchar();
	}
	return x*w;
}
const int p=998244353;
int n,M;
bitset<MAXN> vis;
int c[MAXN];
int f[MAXN],mu[MAXN],inv[MAXN];
vector<int> prim;
void pre(){
	vis[1]=mu[1]=1;
	inv[1]=1;
	for(int i=2;i<=MAXN-5;i++){
		inv[i]=(p-p/i)*inv[p%i]%p;
		if(!vis[i]){
			prim.emplace_back(i);
			mu[i]=-1;
		}
		for(int j=0;j<prim.size()&&i*prim[j]<=MAXN-5;j++){
			vis[i*prim[j]]=1;
			if(i%prim[j]==0)	break;
			mu[i*prim[j]]=-mu[i];
		}
	}
}
signed main(){
	n=RIN;
	pre();
	int x;
	int tot=0;
	for(int i=1;i<=n;i++){
		x=RIN;
		tot+=x;
		tot%=p;
		c[x]++;
		M=max(M,x);
	}
	n=M;
	for(int x=1;x<=n;x++){
		for(int i=x;i<=n;i+=x){
			f[x]+=i*c[i]%p;
			f[x]%=p;
		}
	}
	int ans=0;
	for(int g=1;g<=n;g++){
		for(int d=1;d*g<=n;d++){
			ans+=f[g*d]%p*f[g*d]%p*mu[d]%p*inv[g]%p;
			ans%=p;
		}
	}
	ans-=tot;
	ans=(ans%p+p)%p;
	ans=ans*inv[2]%p;
	printf("%lld",ans);
	return 0;
}
posted @ 2023-02-12 20:09  Cap1taL  阅读(51)  评论(0)    收藏  举报