感觉自己被早上的名校协作体和下午的数学题虐哭了,每天为自己的菜发愁……

发现$a_{i}$很小,开一个桶记一下每个数 出现的个数,设$c_{i} = \sum_{j = 1}^{n}(a_{j} == i)$。

我们知道$lcm(i, j) == \frac{ij}{gcd(i, j)}$。

记$m = max(a_{i})$。

那么  $\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(a_{i}, a_{j}) \  = \sum_{i = 1}^{m}\sum_{j = 1}^{m}\frac{ij}{gcd(i, j)} * c_{i} * c_{j}$。

反演一下,得到  $\sum_{d = 1}^{m}d\sum_{t = 1}^{\left \lfloor \frac{m}{d} \right \rfloor}t^{2} * \mu (t)\sum_{u = 1}^{\left \lfloor \frac{m}{dt} \right \rfloor}\sum_{v = 1}^{\left \lfloor \frac{m}{dt} \right \rfloor}u * v * c_{dtu} * c_{dtv}$。

枚举$T = dt$,得到   $\sum_{T = 1}^{m}(T (\sum_{d | T}d * \mu (d)))(\sum_{u = 1}^{\left \lfloor \frac{m}{T} \right \rfloor}u * c_{Tu})(\sum_{v = 1}^{\left \lfloor \frac{m}{T} \right \rfloor}v * c_{Tv})$。

设$h(T) = \sum_{d | T}d * \mu (d)$,$g(T) = \sum_{d = 1}^{\left \lfloor \frac{m}{T} \right \rfloor}d * c_{Td}$,那么最后的答案就变成了$\sum_{T = 1}^{m}T * h(i) * g^{2}(i)$。

发现$h(i)$是一个积性函数,有$h(1) = 1, h(p) = 1 - p, h(p^{k}) = h(p)$,可以线性筛。

而$g(i)$只要暴力算就可以了。

时间复杂度$O(nlogn)$。

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = 5e4 + ; int n, m = , pCnt = , pri[N], low[N];
ll h[N], g[N], c[N];
bool np[N]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} inline void sieve() {
h[] = ;
for(int i = ; i <= m; i++) {
if(!np[i]) {
pri[++pCnt] = i;
low[i] = i;
h[i] = (ll) - i;
}
for(int j = ; j <= pCnt && i * pri[j] <= m; j++) {
np[i * pri[j]] = ;
if(i % pri[j] == ) {
low[i * pri[j]] = low[i] * pri[j];
if(low[i] == i) h[i * pri[j]] = h[i];
else h[i * pri[j]] = h[i / low[i]] * h[pri[j] * low[i]];
break;
}
low[i * pri[j]] = pri[j];
h[i * pri[j]] = h[i] * h[pri[j]];
}
} /* for(int i = 1; i <= m; i++)
printf("%lld ", h[i]);
printf("\n"); */
} int main() {
read(n);
for(int i = ; i <= n; i++) {
ll x; read(x);
c[x]++;
chkMax(m, x);
} /* for(int i = 1; i <= m; i++)
printf("%lld ", c[i]);
printf("\n"); */ sieve();
for(int i = ; i <= m; i++)
for(int j = ; j <= m / i; j++)
g[i] += c[i * j] * j; /* for(int i = 1; i <= m; i++)
printf("%lld ", g[i]);
printf("\n"); */ ll ans = 0LL;
for(int i = ; i <= m; i++)
ans += i * h[i] * g[i] * g[i]; printf("%lld\n", ans);
return ;
}

   

Luogu 3911 最小公倍数之和的更多相关文章

  1. 51NOD 1238 最小公倍数之和 V3 [杜教筛]

    1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...

  2. 51nod1363 最小公倍数之和

    题目描述 给出一个n,求1-n这n个数,同n的最小公倍数的和. 例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66. 由于结果很大,输出Mo ...

  3. 51nod 1238 最小公倍数之和 V3

    51nod 1238 最小公倍数之和 V3 求 \[ \sum_{i=1}^N\sum_{j=1}^N lcm(i,j) \] \(N\leq 10^{10}\) 先按照套路推一波反演的式子: \[ ...

  4. 51nod 1190 最小公倍数之和 V2

    给出2个数a, b,求LCM(a,b) + LCM(a+1,b) + .. + LCM(b,b). 例如:a = 1, b = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30 ...

  5. 51nod 1363 最小公倍数之和 ——欧拉函数

    给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66. 由于结果很大,输出Mod 1000 ...

  6. 51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3

    1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 输入 1个数N ...

  7. BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)

    LCM Extreme Time Limit: 3000ms Memory Limit: 131072KB   This problem will be judged on UVALive. Orig ...

  8. 51 NOD 1238 最小公倍数之和 V3

    原题链接 最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧…… (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧…… ...

  9. 51nod1238 最小公倍数之和 V3 莫比乌斯函数 杜教筛

    题意:求\(\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\). 题解:虽然网上很多题解说用mu卡不过去,,,不过试了一下貌似时间还挺充足的,..也许有时间用phi ...

随机推荐

  1. 字符串数组是可以保存并输出null。只不过不好动态指定长度

    java里如何输出才能让字符串数组不显示出null 2014-05-23 17:46笨妞纤霏 | 浏览 1360 次  编程语言 代码如下package testCourse; public clas ...

  2. 20165210 Java第二周学习总结

    20165210 Java第二周学习总结 教材学习内容总结 - 第二章学习总结 标识符与关键字: 重点在50个关键字 标识符并不能是关键字 标识符的第一个字符不能是数字字符 Unicode字符集简单了 ...

  3. ios --- 调用系统"设置"里的功能(转)

    安装后第一次运行软件时,系统会弹出提示用户是否允许软件获取当前位置,如果用户不允许的话,之后运行时系统不会在弹出提示设置,这点很不方便,有个解决办法是给用户一个选项,调出iphone中“设置”定位服务 ...

  4. 使用手势对UIImageView进行缩放、旋转和移动(转)

    原文地址:http://blog.csdn.net/crazy_frog/article/details/8664108 // 添加所有的手势 - (void) addGestureRecognize ...

  5. UVA - 10934 Dropping water balloons (dp,逆向思维)

    题目链接 题目大意:给你n个规格一样的气球和一栋大楼的高度,求最少试验几次能测出气球最高在哪一层掉下来不破. 如果这道题想用(dp[i][j]=用i个气球测出j高度的楼需要几次)来作为状态的话,那你就 ...

  6. wpf中将string格式的颜色转换成color类型

    wpf中Brushes有很多对应的颜色,先盗张图,每个颜色对于的名称和ARGB值有了,问题是有时候我们取到的颜色是ARGB值,而且是string类型的,该怎么转换成color呢,只有转换成color之 ...

  7. [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  8. php写入数据到mysql数据库中出现乱码解决方法

    乱码情况: 在选择数据库前加入一句代码即可 mysql_query("set names utf8"); 最后效果

  9. openfl更新2.0后,android输入法又不能输中文了

    今天手贱更新了一下openfl,fd里面又各种报错.最伤心的是,之前修改MainView.java输入中文的方法现在居然失效了.还好这段时间研究c2dx,总算是能读能懂修改的那段代码,捣鼓了一下午,算 ...

  10. python exec内置表达式--exec()

    exec obj功能: exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码.obj 是 要执行的表达式.exec 返回值永远为 Non ...