题目传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=2154

人生中第一道自己做出来的莫比乌斯反演

人生中第一篇用LaTeX写数学公式的博客

大家别看公式多就害怕了啊,这里面的公式大多是很显然的

首先,题目要我们求

$\Large\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)$

这个$lcm$很不好办,我们想办法转化成$gcd$,然后尝试搞莫比乌斯反演的套路

那么因为

$\Large lcm(i,j)=\frac{i \cdot j}{gcd(i,j)}$

所以我们要求的就是

$\Large\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\frac{i \cdot j}{gcd(i,j)}$

于是我们可以枚举每个最大公约数$g$,对于每个$g$,我们求

$\Large\sum\limits_{g=gcd(i,j)}\frac{i \cdot j}{g}$

最后把这些都加起来就好了

继续变形,得到

$\Large\sum\limits_{g=gcd(i,j)}\frac{i}{g} \cdot \frac{j}{g} \cdot {g}$

然后我们设函数

$\Large f(a,b,x)=\sum\limits_{x=gcd(i,j),i \le a,j \le b}\frac{i}{x} \cdot \frac{j}{x}$

于是我们要最终的答案就是

$\Large \sum\limits_{g=1}^{min(n,m)}f(n,m,g) \cdot g$

注意到

$\Large f(a,b,x)=f( \lfloor \frac{a}{x} \rfloor, \lfloor \frac{b}{x} \rfloor,1)$

这一步的原因请读者自行思考

所以最终的答案是

$\Large\sum\limits_{g=1}^{min(n,m)}f( \lfloor \frac{n}{g} \rfloor, \lfloor \frac{m}{g} \rfloor,1) \cdot g$

因为$\lfloor \frac{n}{g} \rfloor$和$\lfloor \frac{m}{g} \rfloor$都是整除,于是这一步我们就可以分块优化,不会分块优化的请先学习 http://sxysxy.org/blogs/77

既然有了分块优化,这一步就可以在$O(\sqrt{n})$的时间内解决,我们只要在$O(\sqrt{n})$的时间内求出来$f(a,b,1)$就好了

我们发现$f(a,b,1)$是和$gcd$相关的函数,于是可以很自然的想到莫比乌斯反演的套路,不会套路的请先学习 http://sxysxy.org/blogs/77

按照套路,我们设

$\Large g(a,b,x)=\sum\limits_{x|gcd(i,j), i \le a, j \le b} \frac{i}{x} \cdot \frac{j}{x}$

于是就有

$\Large g(a,b,x)=\sum\limits_{i=1}^{ \lfloor \frac{min(a,b)}{x} \rfloor }f(a,b,i \cdot x)$

于是按照套路,我们有莫比乌斯反演

$\Large f(a,b,x)=\sum\limits_{i=1}^{ \lfloor \frac{min(a,b)}{x} \rfloor }\mu(i)g(a,b,i \cdot x)$

不会这个套路的请学习 http://sxysxy.org/blogs/77,或者学习WC2016课件,这个也可以从容斥的角度理解

同样对于$g(a,b,x)$,我们有

$\Large g(a,b,x)=g( \lfloor \frac{a}{x} \rfloor, \lfloor \frac{b}{x} \rfloor,1) \cdot x^2$

请读者思考这一步

那么就有

$\Large f(a,b,x)=\sum\limits_{i=1}^{ \lfloor \frac{min(a,b)}{x} \rfloor }\mu(i)g( \lfloor \frac{a}{i} \rfloor, \lfloor \frac{b}{i} \rfloor,x) \cdot i^2$

于是$\lfloor\frac{a}{i}\rfloor$和$\lfloor\frac{b}{i}\rfloor$也都是整除,又可以 前缀和+分块 优化,我们就能在$O(\sqrt{n})$的时间内求出每个$f(a,b,x)$啦

于是我们只要在$O(1)$的时间内求出$g(a,b,x)$,总时间复杂度就是$O(n)$啦!

显然

$\Large g(a,b,x)=g( \lfloor \frac{a}{x} \rfloor, \lfloor \frac{b}{x} \rfloor,1) \cdot x^2=\frac{ \lfloor \frac{a}{x} \rfloor \cdot ( \lfloor \frac{a}{x} \rfloor +1)}{2} \cdot \frac{ \lfloor \frac{b}{x} \rfloor \cdot ( \lfloor \frac{b}{x} \rfloor +1)}{2} \cdot x^2$

为什么显然请读者思考

于是任务大功告成!总时间复杂度为$O(n)$

实际上对于函数$g$和$f$,最后的那个参数$x$是没必要传的,因为在我们的分析中,$x$都被化作$1$了

上代码:

 #include <cstring>
#include <cstdio>
#include <algorithm>
#define register
#define inline using namespace std;
typedef long long ll;
const int MOD = ;
const int MAXN = ; int n, m; bool vis[MAXN] = {};
int prime[MAXN], pidx = , miu[MAXN] = {}, pf[MAXN] = {};
void prelude_miu() {
miu[] = ;
for( register int i = ; i <= n; ++i ) {
if( !vis[i] ) {
prime[pidx++] = i;
miu[i] = -;
}
for( register int j = ; j < pidx; ++j ) {
register int k = i * prime[j];
if( k > n ) break;
vis[k] = true;
if( i % prime[j] ) miu[k] = -miu[i];
else break;
}
}
for( register int i = ; i <= n; ++i ) // 计算miu[i] * i^2的前缀和,注意取模
pf[i] = (pf[i-] + ((ll)miu[i] * i * i % MOD + MOD) % MOD) % MOD;
} inline int g( register int n, register int m ) { // 函数g
return (ll(n)*(n+)/ % MOD) * (ll(m)*(m+)/ % MOD) % MOD;
}
int f( register int n, register int m ) { // 函数f
register int ans = ;
for( register int i = , j; i <= n; i = j+ ) {
j = min( n/(n/i), m/(m/i) ); // 分块优化
// printf( "g(%d,%d) = %lld\n", n/j, m/j, g(n/j,m/j) );
ans = (ans + g(n/j,m/j) * ll((pf[j] - pf[i-] + MOD) % MOD) % MOD) % MOD;
}
return ans;
}
void solve() {
register int ans = ;
for( register int i = , j; i <= n; i = j+ ) { // 枚举最大公因数i
j = min( n/(n/i), m/(m/i) ); // 分块优化
// printf( "f(%d,%d) = %lld\n", n/j, m/j, f(n/j,m/j) );
ans = (ans + f(n/j,m/j) * (ll(i+j)*(j-i+)/ % MOD) % MOD) % MOD;
}
printf( "%d\n", ans );
} int main() {
scanf( "%d%d", &n, &m );
prelude_miu();
if( n > m ) swap(n,m); // 保证n < m,不用每次取min
solve();
return ;
}

【题解】Crash的数字表格 BZOJ 2154 莫比乌斯反演的更多相关文章

  1. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  2. Crash的数字表格 BZOJ 2154 / jzptab BZOJ 2693

    jzptab [问题描述] 求: 多组询问 [输入格式] 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M [输出格式] T行 每行一个整数 表示第i组数据的结果 [样例输入] 1 4 ...

  3. [luogu1829][bzoj2154][国家集训队]Crash的数字表格 / JZPTAB【莫比乌斯反演】

    传送门:洛谷,bzoj 题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时整除a和b的最小正整 ...

  4. 洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    传送门 式子好麻烦orz……大佬好腻害orz->这里 //minamoto #include<iostream> #include<cstdio> #define ll ...

  5. 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    题意:求$\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$. 开始开心(自闭)化简: $\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$ =$\su ...

  6. 【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&&BZOJ 2693 jzptab)

    BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b ...

  7. bzoj 2154 莫比乌斯反演求lcm的和

    题目大意: 表格中每一个位置(i,j)填的值是lcm(i,j) , 求n*m的表格值有多大 论文贾志鹏线性筛中过程讲的很好 最后的逆元我利用的是欧拉定理求解的 我这个最后线性扫了一遍,勉强过了,效率不 ...

  8. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  9. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

随机推荐

  1. 利用maven进行项目管理

    下面为maven项目管理的一个结构 首先pom是路径文件,我们在编译或是运行程序时调用到jdk或一些自己写的jar包时会需要指明物理路径,这里的pom是一样的道理,同时在maven的管理下多出来了一些 ...

  2. LeetCode 240——搜索二维矩阵 II

    1. 题目 2. 解答 2.1. 方法一 从矩阵的左下角开始比较 目标值等于当前元素,返回 true: 目标值大于当前元素,j 增 1,向右查找,排除掉此列上边的数据(都比当前元素更小): 目标值小于 ...

  3. 第十八次ScrumMeeting会议

    第十八次Scrum Meeting 时间:2017/12/8 地点:线上+SPR咖啡馆 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 赵晓宇 照片: 目前工作进展 名字 今日 明天的工 ...

  4. HBase 参考文档翻译之 Getting Started

    本篇是对HBase官方参考文档的大体翻译,介于本人英文水平实在有限,难免有纰漏之处.本篇不只是对官方文档的翻译,还加入了一些本人对HBase的理解.在翻译过程中,一些没有营养的废话,我就忽略了没有翻译 ...

  5. python学习笔记03:python的核心数据类型

    从根本上讲,Python是一种面向对象的语言.它的类模块支持多态,操作符重载和多重继承等高级概念,并且以Python特有的简洁的语法和类型,OOP十分易于使用.Python的语法简单,容易上手. Py ...

  6. 软工网络15团队作业4——Alpha阶段敏捷冲刺-4

    一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 完成程序副界面的设计与信息的输入统计 明天计划完成的工作: 日期等细致信息的处理 工作中遇到的困难: 对微信小程序开发的代码构成有了一些了解 ...

  7. Vim新手节省时间的10多个小技巧

    Vim新手节省时间的10多个小技巧 Vim 是很多开发者的首选编辑器,通过设置正确的命令和快捷方式,它可以帮你更快的完成工作.这篇文章我们为 Vim 新手提供一些快捷键等方面的小技巧,帮你提升工作效率 ...

  8. windows批处理学习(call与start)---02

    参考:https://www.cnblogs.com/Braveliu/p/5078283.html 一.call命令总结 (1)call命令简介 语法: call [ [Drive:] [Path] ...

  9. 第28天:js-Tab栏切换封装函数

    一.input.value所有值都是string 二.变量和属性var index=10;//变量var arr=[];//数组arr.index=20;//index为自定义属性,只能在arr下使用 ...

  10. RT-thread内核之线程内核对象

    在RT-Thread实时操作系统中,任务采用了线程来实现,线程是RT-Thread中最基本的调度单位,它描述了一个任务执行的上下文关系,也描述了这个任务所处的优先等级.重要的任务能拥有相对较高的优先级 ...