[AGC038C] LCMs
题目描述
- 给定一个长度为
的数列 。 - 请你求出
的值模 的结果。 , 。
思路点拨
这种题目还是很好想到莫比乌斯反演的。我们对于序列中的每一个数记录出现的次数
我们暂且讨论
我们令
括号内的式子和逆元
这里给出一份代码:
#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;
}
分类:
数学 / 莫比乌斯反演
, 数学
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现