40pts求调
查看原帖
40pts求调
1059894
unifoly楼主2023/10/31 19:00
#include<stdio.h>
#include<cmath>
#define ll long long
using namespace std;

const int MAXN=5e4+5;
ll n,max;
int A[MAXN];
int exist[MAXN];
int mu[MAXN],isPrime[MAXN],prime[MAXN],pre[MAXN];

ll ans;

void getu(ll n){
	mu[1]=1;
	int cnt=0;
	for(int i=2;i<=n;i++){
		if(!isPrime[i]){
			prime[++cnt]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
			isPrime[i*prime[j]]=1;
			if(i%prime[j]==0){
				mu[i*prime[j]]==0;
				break;
			}else{
				mu[i*prime[j]]=-mu[i];
			}
		}
	}
	for(int i=1;i<=50000;i++){
		for(int j=i;j<=50000;j+=i){
			pre[j]+=mu[i]*i;
		}
	}
}

ll second(int a){
	ll res=0;
	for(int i=1;i<=max/a;i++){
		res+=exist[i*a]*i;
	}
	return res*res;
}

int main(){
	scanf("%d",&n);
	max=0;
	ans=0;
	for(int i=1;i<=n;i++){
		scanf("%d",&A[i]);
		exist[A[i]]+=1;
		if(A[i]>max){
			max=A[i];
		}
	}
	getu(max);
	for(int N=1;N<=max;N++){
		ans+=N*pre[N]*second(N);
	}
	printf("%lld",ans);
	return 0;
}
2023/10/31 19:00
加载中...