自然想到枚举\(gcd(a, b)\),不妨设其为\(d\),并且\(a = di, b = dj(a > b)\)

那么\(\frac{ab}{a + b} = \frac{dij}{i + j}\)

由于此时有\((i,j) = 1\),因此\((i, i + j) = (j, i + j) = 1\)

那么,当且仅当\(i + j | d\)时,\((i, j)\)数对对答案有贡献

对答案有多少的贡献呢?\(\frac{n}{i(i + j)}\) 没有想到这一步

理由是\(d = k(i + j)\),那么只需满足\(ki(i + j) \leq n\)

当\(i > \sqrt n\)时,\((i,j)\)对答案绝对没有贡献

所以答案为\(\sum \limits_{d = 1}^{\sqrt n} \sum \limits_{i = 1}^{\sqrt n / d} \sum \limits_{j} [(i, j) = 1]\frac{n}{i(i + j)}\)

莫比乌斯反演,得到

\(\sum \limits_{d = 1}^{\sqrt n} \mu(d) \sum \limits_{i = 1}^{\sqrt n / d} \sum \limits_{j} \frac{n}{d^2i(i + j)}\)

对内层数论分块统计答案即可一开始把不分块的复杂度算错了,以为能过


分析一下复杂度上界

首先考虑对于确定的\(d\),枚举\(i, j\)的复杂度

\(\sum \limits_{i = 1}^{\sqrt n / d} \sqrt \frac{n}{d^2 i} = \frac{\sqrt n}{d} * \sum \limits_{i = 1}^{\sqrt n / d} \frac{1}{\sqrt i}\)

用归纳法可以证明,右边那个东西\(\leq 2 \sqrt {\sqrt n / d}\)

所以对于一个\(d\)而言,需要\(\frac{n^{\frac{3}{4}}}{d^{\frac{3}{2}}}\)的复杂度

由于\(\frac{1}{1} + \frac{1}{2^{1.5}} + ... + \frac{1}{n^{1.5}} \leq 3\)

所以复杂度就是\(O(n^{\frac{3}{4}})\)

然后绝对跑不到这个上界....


#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; #define ri register int
#define ll long long
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --) const int sid = 1e5 + 5; ll ans;
int n, sq, tot;
int mu[sid], nop[sid], pr[sid];
inline void Sieve(int m) {
mu[1] = 1;
rep(i, 2, m) {
if(!nop[i]) {
pr[++ tot] = i;
mu[i] = -1;
}
rep(j, 1, tot) {
int p = i * pr[j];
if(p > m) break; nop[p] = 1;
if(i % pr[j] == 0) break;
mu[p] = -mu[i];
}
}
} int main() {
cin >> n;
sq = sqrt(n) + 1;
Sieve(sq);
rep(d, 1, sq) {
if(!mu[d]) continue;
int p = d * d;
rep(i, 1, sq / d) {
int fs = n / d / d / i;
for(ri ii = i + 1, jj; ii <= (i << 1) - 1 && ii <= fs; ii = jj + 1) {
jj = min(fs / (fs / ii), (i << 1) - 1);
ans += 1ll * mu[d] * (jj - ii + 1) * (fs / ii);
}
}
}
printf("%lld\n", ans);
return 0;
}

luoguP4466 [国际集训队]和与积 莫比乌斯反演的更多相关文章

  1. 莫比乌斯反演/线性筛/积性函数/杜教筛/min25筛 学习笔记

    最近重新系统地学了下这几个知识点,以前没发现他们的联系,这次总结一下. 莫比乌斯反演入门:https://blog.csdn.net/litble/article/details/72804050 线 ...

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

    题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...

  3. 【洛谷1829】 [国家集训队] Crash的数字表格(重拾莫比乌斯反演)

    点此看题面 大致题意: 求\(\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\). 推式子 不会莫比乌斯反演的可以先去看这篇博客:初学莫比乌斯反演. 反演题显然就是推式子啊~~~ 考 ...

  4. 7.12 NOI模拟赛 积性函数求和 数论基础变换 莫比乌斯反演

    神题! 一眼powerful number 复习了一下+推半天. 可以发现G函数只能为\(\sum_{d}[d|x]d\) 不断的推 可以发现最后需要求很多块G函数的前缀和 发现只有\(\sqrt(n ...

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

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

  6. 【BZOJ-4407】于神之怒加强版 莫比乌斯反演 + 线性筛

    4407: 于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 241  Solved: 119[Submit][Status][Discu ...

  7. bzoj 2440 简单莫比乌斯反演

    题目大意: 找第k个非平方数,平方数定义为一个数存在一个因子可以用某个数的平方来表示 这里首先需要考虑到二分才可以接下来做 二分去查找[1 , x]区间内非平方数的个数,后面就是简单的莫比乌斯反演了 ...

  8. 【Learning】 莫比乌斯反演

    莫比乌斯反演 ​ 对于两个定义域为非负整数的函数\(F(n)\)和\(f(n)\) ​ 若满足:\(F(n)=\sum\limits_{d|n}f(d)\),则反演得到\(f(n)=\sum\limi ...

  9. 我也不知道什么是"莫比乌斯反演"和"杜教筛"

    我也不知道什么是"莫比乌斯反演"和"杜教筛" Part0 最近一直在搞这些东西 做了将近超过20道题目吧 也算是有感而发 写点东西记录一下自己的感受 如果您真的 ...

随机推荐

  1. iOS学习笔记(3)— 屏幕旋转

    一.屏幕旋转机制: iOS通过加速计判断当前的设备方向和屏幕旋转.当加速计检测到方向变化的时候,屏幕旋转的流程如下: 1.设备旋转时,系统接收到旋转事件. 2.系统将旋转事件通过AppDelegate ...

  2. Linux移植随笔:终于解决Tslib的问题了【转】

    转自:http://www.latelee.org/embedded-linux/porting-linux-tslib.html 前段时间让Tslib搞晕头了,原来一切都是版本惹的祸.本文只是一个随 ...

  3. aarch64_p1

    PEGTL-devel-1.3.1-2.fc26.aarch64.rpm 2017-02-14 08:00 63K fedora Mirroring Project PackageKit-1.1.6- ...

  4. dorado 的学习位置、控件使用方法查找、示例演示地址

    dorado的学习位置: http://wiki.bsdn.org/display/dorado7/Project+Home dorado的控件使用方法查找: http://dorado7.bsdn. ...

  5. 【bzoj3065】: 带插入区间K小值 详解——替罪羊套函数式线段树

    不得不说,做过最爽的树套树———— 由于有了区间操作,我们很容易把区间看成一棵平衡树,对他进行插入,那么外面一层就是平衡树了,这就与我们之前所见到的不同了.我们之前所见到的大多数是线段树套平衡树而此题 ...

  6. APUE-文件和目录(八)文件时间

    文件的时间 与文件相关的三个时间值: 访问时间:最后一次访问文件的时间.例如,cat命令会修改这个时间. 修改时间:文件内容最后一次被修改的时间. 状态更改时间:文件的i节点最后一次被修改的时间.例如 ...

  7. java 一个函数如何返回多个值

    在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过 ...

  8. 从源码分析StringUtils包

    今天用到StringUtils.join方法,闲来无聊,看了下源码 当然不可能自己分析,你傻啊,在这里推荐一个别人分析的; http://blog.csdn.net/baidu_31071595/ar ...

  9. SQL Server存储过程的删除方法

    SQL Server存储过程的删除方法使我们经常会用到的,下面就为您介绍扩展存储过程的删除方法,如果您对SQL Server存储过程方面感兴趣的话,不妨一看. --清除SQL Server所有的危险扩 ...

  10. poj 3372(找规律)

    Candy Distribution Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6033   Accepted: 335 ...