NowCoder LCMs(莫比乌斯反演)

NowCoder LCMs

Statement

给你一个长度为 n n n的序列, A 0 , A 1 , … , A n − 1 A_0,A_1,\dots,A_{n-1} A0,A1,,An1. ∑ 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=0n2j=i+1n1lcm(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=21i=0n1j=0n1lcm(Ai,Aj)i=1n1Ai.

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=0N1j=0N1lcm(Ai,Aj)i=0N1j=0N1gcd(Ai,Aj)AiAjd=1Ld1i=0N1j=0N1AiAj[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=0N1j=0N1AiAj[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)=ddf(d)=i=0N1j=0N1AiAj[Aid][Ajd]=i=0N1Ai[Aid]j=0N1Aj[Ajd]=(i=0N1Ai[Aid])2.

f ( d ) = ∑ d ∣ d ′ μ ( d ′ d ) g ( d ′ ) f(d)=\sum_{d|d'}\mu(\frac{d'}{d})g(d') f(d)=ddμ(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=1Ld1f(d)=d=1Ld1ddμ(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值