取模调疯了
查看原帖
取模调疯了
590600
Kreado楼主2023/4/20 20:40

CoDe

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=1e6+7,Mod=998244353;
ll mu[Maxn],sum[Maxn],prime[Maxn],cnt,p[Maxn];
bool isprime[Maxn];
inline void EulerSieve(ll N){
	isprime[1]=isprime[0]=1;
	mu[1]=1;
	for(ll i=2;i<=N;i++){
		if(!isprime[i]) prime[++cnt]=i,mu[i]=-1;
		for(ll j=1;j<=cnt&&prime[j]*i<=N;j++){
			isprime[prime[j]*i]=1;
			if(!(i%prime[j])) break;
			mu[prime[j]*i]=-mu[i];
		}
	}
	for(ll i=1;i<=N;i++)
		for(ll j=i;j<=N;j+=i)
			p[j]=(p[j]+mu[i]*i)%Mod,p[j]=(p[j]+Mod)%Mod;
}
ll n,c[Maxn],V,ans,sum1;
int main(){
	EulerSieve(Maxn-7);
	scanf("%lld",&n);
	for(ll i=1,x;i<=n;i++) scanf("%lld",&x),c[x]++,V=max(V,x),sum1+=x;
	for(ll k=1;k<=V;k++){
		ll tmp=0;
		for(ll j=1;j<=V/k;j++)
			tmp=(tmp+j%Mod*c[k*j]%Mod)%Mod;
		ans=(ans+tmp%Mod*tmp%Mod*k%Mod*p[k]%Mod)%Mod;
		ans=(ans%Mod+Mod)%Mod;
	}
	printf("%lld",((ans-sum1)/2%Mod+Mod)%Mod);
	return 0;
}
2023/4/20 20:40
加载中...