[AGC038C] LCMs

题目描述

  • 给定一个长度为 N 的数列 A1,A2,A3,,AN
  • 请你求出 i=1Nj=i+1Nlcm(Ai,Aj) 的值模 998244353 的结果。
  • 1N2×1051Ai106
  • 1  N  200000
  • 1  Ai  1000000

思路点拨

这种题目还是很好想到莫比乌斯反演的。我们对于序列中的每一个数记录出现的次数 cnti ,这就是指 iA 的出现次数。我们先对原来的式子进行转化。

i=1nj=i+1nlcm(Ai,Aj)

12(i=1Nj=1Nlcm(i,j)×cnticntji=1nAi)

我们暂且讨论 i=1Nj=1Nlcm(i,j)×cnticntj 的部分:

i=1Nj=1Nijgcd(i,j)cnticntj

d=1Ni=1Nj=1Nijdcnticntj[gcd(i,j)=d]

d=1Ndi=1Ndj=1Ndij×cntidcntjd[gcd(i,j)=1]

d=1Ndk=1Ndμ(k)(k=1Nkdk×cntkd)2

我们令 T=kd 那么

T=1Nd|Tdμ(Td)(i=1NTTdcntT)2

T=1Nd|T1dμ(Td)(i=1NTTcntT)2

括号内的式子和逆元 O(nlogn) 预处理就可以了。这样全部的式子都可以在 O(nlogn) 的时间内计算。

这里给出一份代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-f;
		ch=getchar(); 
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
const int mod=998244353;
int qpow(int a,int b){
	int ans=1,base=a;
	while(b){
		if(b&1) ans=ans*base%mod;
		base=base*base%mod;
		b>>=1;
	}
	return ans;
}
const int MAXN=1e6+10,N=1e6;
int n,A[MAXN],cnt[MAXN];
int mu[MAXN],inv[MAXN],f[MAXN];
int temp[MAXN],g[MAXN];
bool vis[MAXN];
void init(){
	inv[0]=1;
	for(int i=1;i<=N;i++){
		mu[i]=1;
		inv[i]=qpow(i,mod-2);
	} 
	for(int i=2;i<=N;i++){
		if(vis[i]) continue;
		mu[i]=-1;
		for(int j=i*2;j<=N;j+=i){
			vis[j]=1;
			mu[j]=-mu[j];
			if(j%(i*i)==0) mu[j]=0;
		}
	}
	for(int d=1;d<=N;d++)
		for(int T=d;T<=N;T+=d)
			f[T]=(f[T]+(mu[T/d]*inv[d]+mod)%mod)%mod;
	for(int T=1;T<=N;T++)
		for(int i=1;i<=N/T;i++)
			g[T]=(g[T]+i*T*cnt[i*T])%mod; 
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		A[i]=read();
		cnt[A[i]]++;
	}	
	init();
	int ans=0;
	for(int d=1;d<=N;d++)
		for(int k=1;k<=(N/d);k++)
			ans=(ans+mu[k]*g[d*k]%mod*g[d*k]%mod*inv[d])%mod;
	for(int i=1;i<=n;i++)
		ans=(ans-A[i]+mod)%mod;
	cout<<ans*inv[2]%mod;
	return 0; 
}
posted @   Diavolo-Kuang  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示