Super_Cube
2024-11-19 19:27:03
设
设
直接上莫比乌斯反演:
所以枚举
莫比乌斯函数值可提前预处理得到,每个数的所有约数直接根号暴力枚举。
时间复杂度:
#include<bits/stdc++.h>
const int mod=998244353;
int mu[1000005];
int sum[1000005];
int n;
int main(){
mu[1]=1;
for(int i=1;i<=500000;++i)
if(mu[i])
for(int j=i<<1;j<=1000000;j+=i)
mu[j]-=mu[i];
scanf("%d",&n);
for(int i=1,pre=0,dp,x;i<=n;++i){
scanf("%d",&x);
dp=(i==1?-1:0);
for(int j=1;j*j<=x;++j)
if(!(x%j)){
if(mu[j])mu[j]==1?(dp+=sum[j])>=mod&&(dp-=mod):(dp-=sum[j])<0&&(dp+=mod);
if(j*j!=x&&mu[x/j])mu[x/j]==1?(dp+=sum[x/j])>=mod&&(dp-=mod):(dp-=sum[x/j])<0&&(dp+=mod);
}
if((dp=pre-dp)<0)dp+=mod;
if(i==n)return 0&printf("%d",dp);
for(int j=1;j*j<=x;++j)
if(!(x%j)){
(sum[j]+=dp)>=mod&&(sum[j]-=mod);
if(j*j!=x)(sum[x/j]+=dp)>=mod&&(sum[x/j]-=mod);
}
if((pre+=dp)>=mod)pre-=mod;
}
return 0;
}