http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1222

求\([a,b]\)中的个数转化为求\([1,b]\)中的个数减去\([1,a)\)中的个数。

\[\begin{aligned}
&\sum_{i=1}^n\sum_{j=1}^n\left[\frac{ij}{(i,j)}\leq n\right]\\
=&\sum_{d=1}^n\sum_{i=1}^{\left\lfloor\frac nd\right\rfloor}\sum_{j=1}^{\left\lfloor\frac nd\right\rfloor}[(i,j)=1][ijd\leq n]\\
=&\sum_{d=1}^n\sum_{i=1}^{\left\lfloor\frac nd\right\rfloor}\sum_{j=1}^{\left\lfloor\frac nd\right\rfloor}\sum_{d'|(i,j)}\mu(d')[ijd\leq n]\\
=&\sum_{d=1}^n\sum_{d'=1}^{\left\lfloor\frac nd\right\rfloor}\mu(d')\sum_{i=1}^{\left\lfloor\frac n{dd'}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac n{dd'}\right\rfloor}\left[ijdd'^2\leq n\right]\\
=&\sum_{d'=1}^{\left\lfloor\sqrt n\right\rfloor}\mu(d')\sum_{d=1}^{\left\lfloor\frac n{d'}\right\rfloor}\sum_{i=1}^{\left\lfloor\frac n{dd'}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac n{dd'}\right\rfloor}\left[ijd\leq\left\lfloor\frac n{d'^2}\right\rfloor\right]\\
\end{aligned}
\]

枚举\(\left\lfloor\sqrt n\right\rfloor\)个\(d'\),对于每个\(d'\),先假定\(d\leq i\leq j\),枚举\(\left\lfloor\left(\frac n{d'}\right)^{\frac 13}\right\rfloor\)个\(d\),\(i\)再从\(d\)枚举到\(\left\lfloor\left(\frac n{dd'}\right)^{\frac 12}\right\rfloor\),最后计算\(j\)的个数,乘上一个排列数即可。

\(f(x)\)表示对每个\(d'\)计算的复杂度。

时间复杂度为\(O\left(\sum\limits_{d'=1}^{\left\lfloor\sqrt n\right\rfloor}f(d')\right)\)。

\[\begin{aligned}
f(x)=&\int_{0}^{\left(\frac n{x^2}\right)^{\frac 13}}\left(\left(\frac n{x^2i}\right)^{\frac 12}-i\right)di\\
=&\left(\frac n{x^2}\right)^{\frac 12}\int_0^{\left(\frac n{x^2}\right)^{\frac 13}}i^{-\frac 12}di-\int_0^{\left(\frac n{x^2}\right)^{\frac 13}}idi\\
=&\left(\frac n{x^2}\right)^{\frac 12}\left(2\left({\left(\frac n{x^2}\right)^{\frac 13}}\right)^{\frac 12}-2\right)-\left(\frac 12\left({\left(\frac n{x^2}\right)^{\frac 13}}\right)^2\right)\\
=&\frac 34\left(\frac n{x^2}\right)^{\frac 23}-2\left(\frac n{x^2}\right)^{\frac 12}
\end{aligned}
\]

\[\begin{aligned}
&O\left(\sum_{d'=1}^{\left\lfloor\sqrt n\right\rfloor}f(d')\right)\\
=&O\left(\int_0^{\sqrt n}\left(\frac n{x^2}\right)^{\frac 23}dx\right)\\
=&O\left(n^{\frac 23}\int_0^{\sqrt n}x^{-\frac 43}dx\right)\\
=&O\left(n^{\frac 23}\left(\left(-3\sqrt{n}^{-\frac 13}\right)-\left(-3\times0^{-\frac 13}\right)\right)\right)\\
=&O\left(3n^{\frac 23}-3n^{\frac 12}\right)\\
=&O\left(n^{\frac 23}\right)
\end{aligned}
\]

所以总时间复杂度为\(O\left(n^{\frac 23}\right)\),好神奇啊qwq

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll; const int sq = 316228; bool notp[sq + 1];
int mu[sq + 1], prime[sq], num = 0; void Euler_shai() {
mu[1] = 1;
for (int i = 2; i <= sq; ++i) {
if (!notp[i]) prime[++num] = i, mu[i] = -1;
for (int j = 1; j <= num && prime[j] * i <= sq; ++j) {
notp[prime[j] * i] = true;
if (i % prime[j] == 0)
break;
mu[prime[j] * i] = -mu[i];
}
}
} ll a, b; ll cal(ll n) {
ll ret = 0;
for (int d = 1; 1ll * d * d <= n; ++d)
if (mu[d]) {
ll up = n / d / d, r = 0;
for (int i = 1; 1ll * i * i * i <= up; ++i) {
ll up2 = up / i;
r += (up2 / i - i) * 3 + 1;
for (int j = i + 1; 1ll * j * j <= up2; ++j)
r += (up2 / j - j) * 6 + 3;
}
mu[d] > 0 ? ret += r : ret -= r;
}
return (ret + n) >> 1;
} int main() {
scanf("%lld%lld", &a, &b);
Euler_shai();
printf("%lld\n", cal(b) - cal(a - 1));
return 0;
}

【51Nod 1222】最小公倍数计数的更多相关文章

  1. 51NOD 1222 最小公倍数计数 [莫比乌斯反演 杜教筛]

    1222 最小公倍数计数 题意:求有多少数对\((a,b):a<b\)满足\(lcm(a,b) \in [1, n]\) \(n \le 10^{11}\) 卡内存! 枚举\(gcd, \fra ...

  2. [51Nod 1222] - 最小公倍数计数 (..怎么说 枚举题?)

    题面 求∑k=ab∑i=1k∑j=1i[lcm(i,j)==k]\large\sum_{k=a}^b\sum_{i=1}^k\sum_{j=1}^i[lcm(i,j)==k]k=a∑b​i=1∑k​j ...

  3. 51nod 1222 最小公倍数计数【莫比乌斯反演】

    参考:https://www.cnblogs.com/SilverNebula/p/7045199.html 所是反演其实反演作用不大,又是一道做起来感觉诡异的题 转成前缀和相减的形式 \[ \sum ...

  4. 【51nod】1222 最小公倍数计数 莫比乌斯反演+组合计数

    [题意]给定a和b,求满足a<=lcm(x,y)<=b && x<y的数对(x,y)个数.a,b<=10^11. [算法]莫比乌斯反演+组合计数 [题解]★具体 ...

  5. 51nod 1682 中位数计数

    1682 中位数计数基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均 ...

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

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

  7. 51nod 1682 中位数计数(前缀和)

    51nod 1682 中位数计数 思路: sum[i]表示到i为止的前缀和(比a[i]小的记为-1,相等的记为0,比a[i]大的记为1,然后求这些-1,0,1的前缀和): hash[sum[i]+N] ...

  8. 51nod1222 最小公倍数计数

    题目来源: Project Euler 基准时间限制:6 秒 空间限制:131072 KB 分值: 640  定义F(n)表示最小公倍数为n的二元组的数量. 即:如果存在两个数(二元组)X,Y(X & ...

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

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

随机推荐

  1. 关于getsockname()/getpeername()函数第一次被调用得到0.0.0.0结果的说明

    最近阅读UNIX网络编程第四章时,书本末尾介绍了两个函数getsockname()和getpeername(),可以用于获取服务器端和客户端的IP地址与端口,原本很简单的两个函数,过一眼即明白函数的用 ...

  2. OpenCV 用二进制位表示 type & channels 的方式

    OpenCV 的类型与通道的表示方法. 参考文件 https://github.com/opencv/opencv/blob/05b15943d6a42c99e5f921b7dbaa8323f3c04 ...

  3. Java基础break、continue语句的用法

    break适用范围:只能用于switch或者是循环语句中.当然可以用于增强for循环. break作用: 1. break用于switch语句的作用是结束一个switch语句. 2. break用于循 ...

  4. 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)

    人生的大起大落莫过如此,下一场我一定要回紫. [A]Points on the line 题意: 一个直线上有\(n\)个点,要求去掉最少的点,使得最远两点距离不超过\(d\). 题解: 暴力两重fo ...

  5. layui table表格字段过长,展示不完整时,鼠标放到上面展示完整信息

    亲测可以直接用 1.首先每个列都有一个title,里面放入完整信息,然后写一个如下的function, function tdTitle(){ $('th').each(function(index, ...

  6. Python Challenge 第 5 关攻略:peak

    # -*- coding: utf-8 -*- # @Time : 2018/9/26 14:03 # @Author : cxa # @File : pickledemo.py # @Softwar ...

  7. C基础 旋转数组查找题目

    前言 - 引言 题目: 一类有序数组旋转查值问题. 例如: 有序数组 [ , , , , , , , , ] 旋转后为 [ , , , , , , , , ] 如何从中找出一个值索引, not fou ...

  8. idea开发工具下载安装教程

    我用这款工具主要用于java开发 在安装这个工具之前需要配置java的环境 java的jdk环境配置 jdk:1.8 jdk官网下载链接 --->点我 进入之后,下拉  选择 jdk1.8版本 ...

  9. Python基础(1):dir(),help()

    Python:3.6.4 开始编写Python程序了...可是,某个模块怎么用呢?模块里的函数怎么用呢?...使用本文介绍的dir().help()两个帮助函数可以 获得绝大部分开发所需要的信息! d ...

  10. python基础学习之路No.1

    版本python2 python语言不分"和',两者可以一样使用,同等效果 1.输出print python3中print是一个函数 print "hello world" ...