Sum of LCM (lcmsum)

题目

【题目描述】

对于 $ A_1, A_2, \ldots, A_N $ ,求$\sum_{i = 1}^N \sum_{j = 1}^N \mathrm{lcm}(A_i, A_j)$ 的值。

$ \mathrm{lcm}(a, b) $ 表示 $ a $ 和 $ b $ 的最小公倍数

【输入格式】

第 $ 1 $ 行, $ 1 $ 个整数 $ N $ 。

第 $ 2 $ 行, $ N $ 个整数 $ A_1, A_2, \ldots, A_N $ 。

【输出格式】

$ 1 $ 个整数,表示所求的值。

【样例输入】

2

2 3

【样例输出】

17

【数据范围与提示】

对于 $ 30\% $ 的数据, $ 1 \leq N \leq 1000, 1 \leq A_i \leq 50000 $ ;

对于另外 $ 30\% $ 的数据, $ 1 \leq N \leq 50000, 1 \leq A_i \leq 1000 $ ;

对于 $ 100\% $ 的数据, $ 1 \leq N \leq 50000, 1 \leq A_i \leq 50000 $ 。

题解

期中考考得什么都不会了

记 $ f_i $ 表示被 $ i $ 整除的 $ a_j $ 除 $ i $ 的和

$ f_i =  \sum_{i|a_j} a_j $

$ g_i $ 表示 $ \sum_{j=1}^{n} \sum_{k=1}^{n} lcm(a_j,a_k)[i|gcd(a_j,a_k)] $

$ g_i=f_i^2*i $ 

但是 $ i $ 不一定为 $ gcd(a_j,a_k) $,那么考虑容斥掉 $ gcd(a_j,a_k) $ 为 $ i $ 的倍数的值

$ h_i=g_i-\sum_{j=2}^{i*j\leq max}h_{i*j}*j $

则 $ ans=\sum_{i=1}^{max}h_i $

代码

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define _(d) while(d(isdigit(ch=getchar())))
 4 using namespace std;
 5 int R(){
 6     int x;bool f=1;char ch;_(!)if(ch=='-')f=0;x=ch^48;
 7     _()x=(x<<3)+(x<<1)+(ch^48);return f?x:-x;}
 8 const int N=1e5+5;
 9 int n,a[N],mx;
10 LL ans,f[N],g[N];
11 int main(){
12     n=R();
13     for(int i=1;i<=n;i++){
14         mx=max(a[i]=R(),mx);
15         for(int j=1;j*j<=a[i];j++)
16             if(a[i]%j==0){
17                 g[j]+=a[i]/j;
18                 if(j*j!=a[i])g[a[i]/j]+=j;
19             }
20     }
21     for(int i=1;i<=mx;i++)f[i]=g[i]*g[i]*i;
22     for(int i=mx;i;i--){
23         for(int j=2;i*j<=mx;j++)
24             f[i]=f[i]-f[i*j]*j;
25         ans+=f[i];
26     }
27     cout<<ans<<endl;
28     return 0;
29 }
View Code

 

posted @ 2019-04-30 16:50  Chm_wt  阅读(207)  评论(0编辑  收藏  举报