Luogu 3911 最小公倍数之和
感觉自己被早上的名校协作体和下午的数学题虐哭了,每天为自己的菜发愁……
发现$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 最小公倍数之和的更多相关文章
- 51NOD 1238 最小公倍数之和 V3 [杜教筛]
1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...
- 51nod1363 最小公倍数之和
题目描述 给出一个n,求1-n这n个数,同n的最小公倍数的和. 例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66. 由于结果很大,输出Mo ...
- 51nod 1238 最小公倍数之和 V3
51nod 1238 最小公倍数之和 V3 求 \[ \sum_{i=1}^N\sum_{j=1}^N lcm(i,j) \] \(N\leq 10^{10}\) 先按照套路推一波反演的式子: \[ ...
- 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 ...
- 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 ...
- 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 ...
- BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)
LCM Extreme Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Orig ...
- 51 NOD 1238 最小公倍数之和 V3
原题链接 最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧…… (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧…… ...
- 51nod1238 最小公倍数之和 V3 莫比乌斯函数 杜教筛
题意:求\(\sum_{i = 1}^{n}\sum_{j = 1}^{n}lcm(i, j)\). 题解:虽然网上很多题解说用mu卡不过去,,,不过试了一下貌似时间还挺充足的,..也许有时间用phi ...
随机推荐
- RTP协议全解(H264码流和PS流)
写在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢. 互联网的发展离不开大家的无私奉献,我决定从我做起,希 ...
- memcached数据库
Python-memcached的基本使用
- fastjson --JSONObject 和JSONArray 转换
fastjson解析:resultValue=[ { "total": 1, "saleLists": [ ...
- 除了IE浏览器能识别之外,其他浏览器都不能识别的html写法
最近写html页面的时候发现顶部边界margin-top用了定位之后,IE的跟其他浏览器不同,所以用到了把IE跟其他浏览器区分开来的写法 <!--[if !IE]> <div cla ...
- 使用Asset Pipeline管理rails生产环境静态资源实现步骤
1. 修改项目中指向静态资源文件的链接 a) 访问静态资源文件 <%= stylesheet_link_tag "application", media: &q ...
- 开发环境入门 linux基础 (部分)网络 SSH 更名 DNS解析 元字符
nginx---> web ifconfig 查看网络配置信息 id add show 查看当前网卡信息(最小安装下) mtu 是指网卡传输的最大单元 单位:字节 网卡配置 临时配置 ifcon ...
- java 多线程系列基础篇(一)
多线程状态图: Thread类的两个方法比较: yield方法: Yield是一个静态的原生(native)方法 Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程. Yiel ...
- leetcode665
这道题目,主要是判断相邻的两个值的大小,并按照要求的方式,将数组的数值都修正为符合要求的值. 然后通过一次的遍历,计算所累积的移动次数. bool checkPossibility(vector< ...
- [Python Study Notes]pd.read_csv()函数读取csv文件绘图
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- [CSS Hack]解決IE6、IE7、IE8、Firefox的瀏覽器相容性問題!
每次調CSS最令人頭痛的就是瀏覽器校正問題,因為每個瀏覽器對CSS的解釋都不太一樣,Firefox本身算是比較照規矩來,處理上比較簡單,但是遇到微軟的IE系列頭就大了,雖然都是IE,但是IE6.IE7 ...