NowCoder LCMs
Statement
给你一个长度为 n n n的序列, A 0 , A 1 , … , A n − 1 A_0,A_1,\dots,A_{n-1} A0,A1,…,An−1. ∑ i = 0 n − 2 ∑ j = i + 1 n − 1 lcm ( A i , A j ) mod 998244353 \sum_{i=0}^{n-2}\sum_{j=i+1}^{n-1}\text{lcm}(A_i,A_j)\text{ mod }998244353 ∑i=0n−2∑j=i+1n−1lcm(Ai,Aj) mod 998244353.
Solution
A n s = 1 2 ∑ i = 0 n − 1 ∑ j = 0 n − 1 lcm ( A i , A j ) − ∑ i = 1 n − 1 A i Ans=\frac{1}{2}\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}\text{lcm}(A_i,A_j)-\sum_{i=1}^{n-1}A_i Ans=21∑i=0n−1∑j=0n−1lcm(Ai,Aj)−∑i=1n−1Ai.
由
lcm
(
A
i
,
A
j
)
=
A
i
A
j
gcd
(
A
i
,
A
j
)
\text{lcm}(A_i,A_j)=\frac{A_iA_j}{\gcd(A_i,A_j)}
lcm(Ai,Aj)=gcd(Ai,Aj)AiAj.
∑
i
=
0
N
−
1
∑
j
=
0
N
−
1
lcm
(
A
i
,
A
j
)
=
∑
i
=
0
N
−
1
∑
j
=
0
N
−
1
A
i
A
j
gcd
(
A
i
,
A
j
)
=
∑
d
=
1
L
1
d
∑
i
=
0
N
−
1
∑
j
=
0
N
−
1
A
i
A
j
[
gcd
(
A
i
,
A
j
)
=
d
]
\begin{aligned} &\sum_{i=0}^{N-1}\sum_{j=0}^{N-1}\text{lcm}(A_i,A_j)\\ =&\sum_{i=0}^{N-1}\sum_{j=0}^{N-1}\frac{A_iA_j}{\gcd(A_i,A_j)}\\ =&\sum_{d=1}^{L}\frac{1}{d}\sum_{i=0}^{N-1}\sum_{j=0}^{N-1}A_iA_j[\gcd(A_i,A_j)=d] \end{aligned}
==i=0∑N−1j=0∑N−1lcm(Ai,Aj)i=0∑N−1j=0∑N−1gcd(Ai,Aj)AiAjd=1∑Ld1i=0∑N−1j=0∑N−1AiAj[gcd(Ai,Aj)=d]
设
f
(
d
)
=
∑
i
=
0
N
−
1
∑
j
=
0
N
−
1
A
i
A
j
⋅
[
gcd
(
A
i
,
A
j
)
=
d
]
f(d)=\sum_{i=0}^{N-1}\sum_{j=0}^{N-1}A_iA_j\cdot[\gcd(A_i,A_j)=d]
f(d)=∑i=0N−1∑j=0N−1AiAj⋅[gcd(Ai,Aj)=d].
设 g ( d ) = ∑ d ∣ d ′ f ( d ′ ) = ∑ i = 0 N − 1 ∑ j = 0 N − 1 A i A j [ A i ∣ d ] [ A j ∣ d ] = ∑ i = 0 N − 1 A i [ A i ∣ d ] ∑ j = 0 N − 1 A j [ A j ∣ d ] = ( ∑ i = 0 N − 1 A i [ A i ∣ d ] ) 2 g(d)=\sum_{d|d'}f(d')=\sum_{i=0}^{N-1}\sum_{j=0}^{N-1}A_iA_j[A_i|d][A_j|d]=\sum_{i=0}^{N-1}A_i[A_i|d]\sum_{j=0}^{N-1}A_j[A_j|d]=(\sum_{i=0}^{N-1}A_i[A_i|d])^2 g(d)=∑d∣d′f(d′)=∑i=0N−1∑j=0N−1AiAj[Ai∣d][Aj∣d]=∑i=0N−1Ai[Ai∣d]∑j=0N−1Aj[Aj∣d]=(∑i=0N−1Ai[Ai∣d])2.
则 f ( d ) = ∑ d ∣ d ′ μ ( d ′ d ) g ( d ′ ) f(d)=\sum_{d|d'}\mu(\frac{d'}{d})g(d') f(d)=∑d∣d′μ(dd′)g(d′).
则
∑
d
=
1
L
1
d
f
(
d
)
=
∑
d
=
1
L
1
d
∑
d
∣
d
′
μ
(
d
′
d
)
g
(
d
′
)
\begin{aligned} \sum_{d=1}^L\frac{1}{d}f(d)=&\sum_{d=1}^L\frac{1}{d}\sum_{d|d'}\mu(\frac{d'}{d})g(d')\\ \end{aligned}
d=1∑Ld1f(d)=d=1∑Ld1d∣d′∑μ(dd′)g(d′)
Code
# define Fast_IO std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
# include "unordered_map"
# include "algorithm"
# include "iostream"
# include "cstdlib"
# include "cstring"
# include "cstdio"
# include "vector"
# include "bitset"
# include "queue"
# include "cmath"
# include "ctime"
# include "map"
# include "set"
# define ll long long
# define ld long double
# define rep1(i,a,b) for(ll i=(a);i<=(b);i++)
# define rep2(i,a,b) for(ll i=(b);i>=(a);i--)
# define pii pair<int,int>
# define pll pair<ll,ll>
# define ph push_back
# define pb pop_back
# define eb emplace_back
# define vi vector<int>
# define vll vector<ll>
# define vpi vector<pii >
# define vpll vector<pll >
# define ri(x) scanf("%d",&x)
# define rf(x) scanf("%f",&x)
# define rl(x) scanf("%lld",&x)
# define rd(x) scanf("%lf",&x)
# define rs(s) scanf("%s",s+1)
# define wi(x) printf("%d",x)
# define wl(x) printf("%lld",x)
# define ws(s) printf("%s",s+1)
# define resize(v,x) v.resize(x)
# define all(v) v.begin(),v.end()
# define reverse(v) reverse(all(v))
# define fi first
# define se second
# define lowbit(x) ((x)&(-(x)))
# define repauto(Name,v) for(auto Name:v)
# define Endl "\n"
using namespace std;
template<class I> inline I GCD(I A,I B){return B?GCD(B,A%B):A;}
template<class I> inline I LCM(I A,I B){return A/GCD(A,B)*B;}
template<class I> I Sqrt(I N){
I sqrtN=sqrt(N)-1;
while(sqrtN+1<=N/(sqrtN+1))sqrtN++;
return sqrtN;
}
template<class I> I Pow(I X,I Y,__int128 Mod1=998244353){
static __int128 Ans; Ans=1;
for(;Y;Y>>=1,X=(__int128)X*X%Mod1) if(Y&1) Ans=Ans*X%Mod1;
return Ans;
}
namespace Mu_Class{
int Prime_Cnt;
int *Prime=new int;
int *Mu=new int;
int *Visit=new int;
inline void Init(int N){
static int i,j;
delete Visit; Visit=new int[N+1]();
delete Prime; Prime=new int[N+1]();
delete Mu; Mu=new int[N+1]();
for(Mu[1]=1,i=2;i<=N;i++){
if(!Visit[i]){
Visit[i]=i,Mu[i]=-1;
Prime[++Prime_Cnt]=i;
}for(j=1;j<=Prime_Cnt && Visit[i]>=Prime[j] && Prime[j]<=N/i;j++){
Mu[i*Prime[j]]=Visit[i]==Prime[j]?0:Mu[i]*(-1);
Visit[i*Prime[j]]=Prime[j];
}
}return;
}
}using namespace Mu_Class;
const int maxm=1e6+10;
const int Mod=998244353;
int N;
ll Num[maxm],X;
ll Inv[maxm],F[maxm],Ans;
int main(){
# ifdef LH_Frank
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
# endif
ri(N);
rep1(i,1,N) rl(X),Ans-=X,Num[X]++;
Inv[0]=Inv[1]=1;
rep1(i,2,1000000) Inv[i]=(Mod-Mod/i)*Inv[Mod%i]%Mod;
Init(1000000);
rep1(i,1,1000000){
for(int j=i;j<=1000000;j+=i) F[i]=(F[i]+1LL*j*Num[j])%Mod;
F[i]=F[i]%Mod*F[i]%Mod;
}
rep1(i,1,1000000){
ll Res=0;
for(int j=i;j<=1000000;j+=i){
Res=(Res+Mu[j/i]*F[j])%Mod;
}Ans=(Ans+Inv[i]*Res)%Mod;
}Ans=Ans*Inv[2]%Mod;
wl((Ans+Mod)%Mod);
return 0;
}
Link
[1] NowCoder LCMs