题面

求∑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=1∑i​[lcm(i,j)==k]

1&lt;=a&lt;=b&lt;=10111&lt;=a&lt;=b&lt;=10^{11}1<=a<=b<=1011

题目分析

令f(n)=∑i=1n∑j=1i[lcm(i,j)==n]\large f(n)=\sum_{i=1}^n\sum_{j=1}^i[lcm(i,j)==n]f(n)=∑i=1n​∑j=1i​[lcm(i,j)==n]

则Ans=∑i=abf(i)\large Ans=\sum_{i=a}^bf(i)Ans=∑i=ab​f(i)

f(n)=∑i=1n∑j=1i[i⋅j==n⋅(i,j)]=∑d∣n∑d∣i∑d∣j,j&lt;=i[i⋅j==nd &amp;&amp; (id,jd)==1]=∑d∣n∑i=1nd∑j=1i[ij==nd &amp;&amp; (i,j)==1]=∑d∣n∑i=1d∑j=1i[ij==d &amp;&amp; (i,j)==1]=∑d∣nh(d)\large f(n)=\sum_{i=1}^n\sum_{j=1}^i[i\cdot j==n\cdot (i,j)]\\=\sum_{d|n}\sum_{d|i}\sum_{d|j,j&lt;=i}[i\cdot j==nd~\&amp;\&amp;~(\frac id,\frac jd)==1]\\=\sum_{d|n}\sum_{i=1}^{\frac nd}\sum_{j=1}^i[ij==\frac nd~\&amp;\&amp;~(i,j)==1]\\=\sum_{d|n}\sum_{i=1}^d\sum_{j=1}^i[ij==d~\&amp;\&amp;~(i,j)==1]\\=\sum_{d|n}h(d)f(n)=i=1∑n​j=1∑i​[i⋅j==n⋅(i,j)]=d∣n∑​d∣i∑​d∣j,j<=i∑​[i⋅j==nd && (di​,dj​)==1]=d∣n∑​i=1∑dn​​j=1∑i​[ij==dn​ && (i,j)==1]=d∣n∑​i=1∑d​j=1∑i​[ij==d && (i,j)==1]=d∣n∑​h(d)

此处h(d)h(d)h(d)表示小于等于ddd中,满足两个数互质且乘积为ddd的无序数对的个数,显然

h(d)={1 , d=12ω(d)−1 , d=∏i=1ω(d)piai\large h(d)=\left\{
\begin{aligned}
&amp;1~,~d=1\\
&amp;2^{\omega(d)-1}~,~d=\prod_{i=1}^{\omega(d)}p_i^{a_i}\\
\end{aligned}
\right.h(d)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​​1 , d=12ω(d)−1 , d=i=1∏ω(d)​piai​​​其中ω(d)\large\omega(d)ω(d)表示d的质因子个数

相当于把d的质因数分成两部分,所以就每个质因数选或不选,又因为是无序数对,所以除以2,也可以写为以下形式

h(d)=2ω(d)+[d==1]2\large h(d)=\frac{2^{\omega(d)}+[d==1]}2h(d)=22ω(d)+[d==1]​

  • 有没有发现十分类似某个等式,记与nnn互质的数的和为a(n)a(n)a(n)(随便选的字母),则
  • a(n)=φ(n)n+[n==1]2a(n)=\frac{\varphi(n)n+[n==1]}2a(n)=2φ(n)n+[n==1]​

回到这道题,有f(n)=∑d∣nh(d)=∑d∣n2ω(d)+[d==1]2=1+∑d∣n2ω(d)2\large f(n)=\sum_{d|n}h(d)=\sum_{d|n}\frac{2^{\omega(d)}+[d==1]}2\\=\frac{1+\sum_{d|n}2^{\omega(d)}}2f(n)=d∣n∑​h(d)=d∣n∑​22ω(d)+[d==1]​=21+∑d∣n​2ω(d)​

然后我们又发现其实2ω(d)\large2^{\omega(d)}2ω(d)是每个质因数选或不选的方案数,及ddd的无平方因子的约数的个数,所以2ω(d)=∑k∣d∣μ(k)∣\large 2^{\omega(d)}=\sum_{k|d}|\mu(k)|2ω(d)=k∣d∑​∣μ(k)∣根据μ\muμ函数的定义,我们知道只有无平方因子数的函数值才为1或-1,所以加上绝对值就成了计数

∴∑i=1nf(i)=n+∑i=1n∑d∣i2ω(d)2=n+∑i=1n∑d∣i∑k∣d∣μ(k)∣2\large \therefore \sum_{i=1}^nf(i)=\frac{n+\sum_{i=1}^n\sum_{d|i}2^{\omega(d)}}2=\frac{n+\sum_{i=1}^n\sum_{d|i}\sum_{k|d}|\mu(k)|}2∴i=1∑n​f(i)=2n+∑i=1n​∑d∣i​2ω(d)​=2n+∑i=1n​∑d∣i​∑k∣d​∣μ(k)∣​

∵∑i=1n∑d∣i∑k∣d∣μ(k)∣=∑k=1n∣μ(k)∣∑k∣d∑d∣i1=∑k=1n∣μ(k)∣∑k∣d⌊nd⌋=∑k=1n∣μ(k)∣∑d=1⌊nk⌋⌊ndk⌋=∑k=1n∣μ(k)∣∑d=1⌊nk⌋⌊⌊nk⌋d⌋=∑k=1n∣μ(k)∣∑d=1⌊nk⌋⌊⌊nk⌋d⌋\large\because \sum_{i=1}^n\sum_{d|i}\sum_{k|d}|\mu(k)|=\sum_{k=1}^n|\mu(k)|\sum_{k|d}\sum_{d|i}1\\=\sum_{k=1}^n|\mu(k)|\sum_{k|d}\lfloor\frac nd\rfloor\\=\sum_{k=1}^n|\mu(k)|\sum_{d=1}^{\lfloor\frac nk\rfloor}\lfloor\frac n{dk}\rfloor\\=\sum_{k=1}^n|\mu(k)|\sum_{d=1}^{\lfloor\frac nk\rfloor}\lfloor\frac {\lfloor\frac nk\rfloor}d\rfloor\\=\sum_{k=1}^n|\mu(k)|\sum_{d=1}^{\lfloor\frac nk\rfloor}\lfloor\frac {\lfloor\frac nk\rfloor}d\rfloor∵i=1∑n​d∣i∑​k∣d∑​∣μ(k)∣=k=1∑n​∣μ(k)∣k∣d∑​d∣i∑​1=k=1∑n​∣μ(k)∣k∣d∑​⌊dn​⌋=k=1∑n​∣μ(k)∣d=1∑⌊kn​⌋​⌊dkn​⌋=k=1∑n​∣μ(k)∣d=1∑⌊kn​⌋​⌊d⌊kn​⌋​⌋=k=1∑n​∣μ(k)∣d=1∑⌊kn​⌋​⌊d⌊kn​⌋​⌋

  • 先看第二个∑\large\sum∑,对于某一个⌊nk⌋\large{\lfloor\frac nk\rfloor}⌊kn​⌋的取值,把它记作NNN,就以NNN的范围做整除分块优化,Θ(N)\large\Theta(\sqrt N)Θ(N​)的时间复杂度,那么外层还有一个求和,于是在外面也套一层整除分块优化,预处理出前n23\large n^{\frac 23}n32​后时间复杂度为Θ(n23)\large\Theta(n^{\frac23})Θ(n32​)

    • 此处预处理为线性筛,考虑变换,∑i=1n⌊ni⌋\large\sum_{i=1}^n\large{\lfloor\frac ni\rfloor}∑i=1n​⌊in​⌋实际可看作枚举iii后看nnn以内有多少个数能被iii整除,这不就是∑i=1nσ0(i)\large\sum_{i=1}^n\sigma_0(i)∑i=1n​σ0​(i)吗?(这个函数表示i的约数个数)

      于是我们只需要筛出约数个数在累加就行了,线性筛时存一下当前数的最小质因子的次数就可以愉快的线性筛了
  • 由于在外面一层套上了整除分块优化,则需要求出∣μ(k)∣\large |\mu(k)|∣μ(k)∣的前缀和,也就是nnn以内的无平方因子数

    • 这里处理无平方因子数时用容斥原理,有

      ∑i=1n∣μ(i)∣=∑i=1nμ(i)⋅⌊ni2⌋\large\sum_{i=1}^n|\mu(i)|=\sum_{i=1}^{\sqrt n}\mu(i)\cdot\lfloor\frac n{i^2}\rfloori=1∑n​∣μ(i)∣=i=1∑n​​μ(i)⋅⌊i2n​⌋想想μ\muμ函数的定义,这个容斥还是比较好理解的

      Θ(n)\large \Theta(\sqrt n)Θ(n​)可处理出来
  • 其实这道题用的是[SPOJ] DIVCNT2 - Counting Divisors (square)一模一样的方法(我后面的分析都是直接粘的233)

  • 但是奈何这道题TM\color{white}TMTM的卡内存!(各种预处理+卡内存我只能做到6015ms>6000ms T了…)

  • 只能想想别的办法(也许有些同学掌握特殊的卡常技巧能过A掉吧)

.

.

.

.

.

好的。

正文开始

那么我就要开始略讲一点了

定义F(i)=∑x=1i∑y=1x[xy(x,y)==i]\large F(i)=\sum_{x=1}^i\sum_{y=1}^x[\frac{xy}{(x,y)}==i]F(i)=∑x=1i​∑y=1x​[(x,y)xy​==i]

则Ans=∑i=1bF(i)−∑i=1a−1F(i)\large Ans=\sum_{i=1}^bF(i)-\sum_{i=1}^{a-1}F(i)Ans=∑i=1b​F(i)−∑i=1a−1​F(i)

考虑∑i=1nF(i)\sum_{i=1}^nF(i)∑i=1n​F(i)怎么求

设(x,y)=r,x=ar,y=br(x,y)=r,x=ar,y=br(x,y)=r,x=ar,y=br,则

∑i=1nF(i)=∑x=1n∑y=1x[xyr≤n]=∑a∑b∑r[a≤b][(a,b)==1][abr≤n]\large \sum_{i=1}^nF(i)=\sum_{x=1}^n\sum_{y=1}^x[\frac {xy}r\le n]\\=\sum_a\sum_b\sum_r[a\le b][(a,b)==1][abr\le n]i=1∑n​F(i)=x=1∑n​y=1∑x​[rxy​≤n]=a∑​b∑​r∑​[a≤b][(a,b)==1][abr≤n]反演一下得到∑i=1nF(i)=∑d=1nμ(d)∑a∑b∑r[a≤b][abr≤⌊nd2⌋]\large \sum_{i=1}^nF(i)=\sum_{d=1}^{\sqrt n}\mu(d)\sum_a\sum_b\sum_r[a\le b][abr\le \lfloor\frac n{d^2}\rfloor]i=1∑n​F(i)=d=1∑n​​μ(d)a∑​b∑​r∑​[a≤b][abr≤⌊d2n​⌋]不考虑[a≤b][a\le b][a≤b]的话就是a,b,ra,b,ra,b,r三个数的乘积的统计,做法为统计x≤y≤z &amp;&amp; xyz≤Nx\le y\le z~\&amp;\&amp;~xyz\le Nx≤y≤z && xyz≤N的(x,y,z)(x,y,z)(x,y,z)数对的数量

分别考虑三个数不相等/两个数相等/三个数相等的情况再分别乘上排列系数

由于这样的枚举只需要枚举x≤N13\large x\le N^{\frac 13}x≤N31​,在枚举x≤y≤Nx\large x\le y\le \frac Nxx≤y≤xN​,然后Θ(1)\Theta(1)Θ(1)统计zzz的个数

[a≤b][a\le b][a≤b]比较讨厌,假设(a,b)(a,b)(a,b)与(b,a)(b,a)(b,a)被统计两次,因为有a=ba=ba=b的情况不能直接除以222

回到原问题,当a=ba=ba=b时,由于(a,b)=1(a,b)=1(a,b)=1,所以a=b=1a=b=1a=b=1,此时rrr有nnn种取值,所以只需要在算出的结果加上nnn再除以222即可

参考自 51Nod 题解1楼

时间复杂度证明

设T(n)T(n)T(n)表示统计满足xyz&lt;=nxyz&lt;=nxyz<=n的(x,y,z)(x,y,z)(x,y,z)的三元组个数的时间复杂度

T(n)=Θ(∑x=1n13(nx−x))=Θ(n23)\large T(n)=\Theta\left(\sum_{x=1}^{n^{\frac 13}}(\sqrt{\frac nx}-x)\right)=\Theta(n^{\frac 23})T(n)=Θ⎝⎜⎜⎛​x=1∑n31​​(xn​​−x)⎠⎟⎟⎞​=Θ(n32​)

上面的−x-x−x是枚举yyy时从x+1x+1x+1开始枚举,总时间复杂度=Θ(∑d=1nT(nd2))=Θ(∑d=1nT((nd)2))=Θ(∑d=1n(nd)43)=Θ(∑d=1n(n23d43))=Θ(n23∑d=1n(1d43))\large =\Theta\left(\sum_{d=1}^{\sqrt n}T(\frac n{d^2})\right)\\=\Theta\left(\sum_{d=1}^{\sqrt n}T((\frac{\sqrt n}d)^2)\right)\\=\Theta\left(\sum_{d=1}^{\sqrt n}(\frac{\sqrt n}d)^{\frac 43}\right)\\=\Theta\left(\sum_{d=1}^{\sqrt n}(\frac{n^{\frac 23}}{d^{\frac 43}})\right)\\=\Theta\left(n^{\frac 23}\sum_{d=1}^{\sqrt n}(\frac{1}{d^{\frac 43}})\right)=Θ⎝⎜⎛​d=1∑n​​T(d2n​)⎠⎟⎞​=Θ⎝⎜⎛​d=1∑n​​T((dn​​)2)⎠⎟⎞​=Θ⎝⎜⎛​d=1∑n​​(dn​​)34​⎠⎟⎞​=Θ⎝⎜⎛​d=1∑n​​(d34​n32​​)⎠⎟⎞​=Θ⎝⎜⎛​n32​d=1∑n​​(d34​1​)⎠⎟⎞​此处ddd的枚举应该是离散的,我们将它看做连续的,由于n=n12\sqrt n=n^{\frac 12}n​=n21​那么将ddd两两结合,有

∫1n14(1x43)+(1(n12x34))dx&gt;=∫1n142(1x43(n12x34))dx=∫1n142(1n12)dx\large\int_{1}^{n^{\frac 14}} (\frac 1{x^{\frac 43}})+(\frac 1{(\frac{n^{\frac 12}}{x^{\frac 34}})})dx\\&gt;=\int_{1}^{n^{\frac 14}} 2\left(\frac 1{x^{\frac 43}{(\frac{n^{\frac 12}}{x^{\frac 34}})}}\right)dx\\=\int_{1}^{n^{\frac 14}} 2\left(\frac 1{n^{\frac 12}}\right)dx∫1n41​​(x34​1​)+((x43​n21​​)1​)dx>=∫1n41​​2⎝⎜⎜⎛​x34​(x43​n21​​)1​⎠⎟⎟⎞​dx=∫1n41​​2(n21​1​)dx于是我们又回到离散的,最多有n122\frac{n^\frac 12}22n21​​对这样的关系,所以

∑d=1n(1d43)=n122⋅2(1n12)=1\large \sum_{d=1}^{\sqrt n}(\frac{1}{d^{\frac 43}})=\frac{n^\frac 12}2\cdot2\left(\frac 1{n^{\frac 12}}\right)=1d=1∑n​​(d34​1​)=2n21​​⋅2(n21​1​)=1所以总时间复杂度为Θ(n23∑d=1n(1d43))=Θ(n23)\large \Theta\left(n^{\frac 23}\sum_{d=1}^{\sqrt n}(\frac{1}{d^{\frac 43}})\right)=\Theta(n^{\frac 23})Θ⎝⎜⎛​n32​d=1∑n​​(d34​1​)⎠⎟⎞​=Θ(n32​)

申明:以上的∫\int∫符号纯属乱用,只是不能再用∑\sum∑表示xxx的取值可能不为整数的和了

AC code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 316228;
int Cnt, Prime[N], mu[N];
bool IsnotPrime[N]; void init()
{
mu[1] = 1;
for(int i = 2; i < N; ++i)
{
if(!IsnotPrime[i])
Prime[++Cnt] = i, mu[i] = -1;
for(int j = 1; j <= Cnt && i * Prime[j] < N; ++j)
{
IsnotPrime[i * Prime[j]] = 1;
if(i % Prime[j] == 0) { mu[i * Prime[j]] = 0; break; }
mu[i * Prime[j]] = -mu[i];
}
}
} LL solve(LL n)
{
LL ret = n;
for(int d = 1; (LL)d*d <= n; ++d) if(mu[d])
{
LL m = n/((LL)d*d), s = 0;
for(int a = 1; (LL)a*a*a <= m; ++a)
{
for(int b = a+1; (LL)a*b*b <= m; ++b)
s += (m/((LL)a*b)-b) * 6 + 3; // * 6 -> a < b < c ( P(3,3) = 6 )
// + 3 -> a < b = c ( P(3,3)/P(2,2) = 3)
s += (m/((LL)a*a)-a) * 3 + 1; // * 3 -> a = b < c ( P(3,3)/P(2,2) = 3 )
// + 1 -> a = b = c
}//以上的"-b","-a"都是为了满足 c>b 或 c>b=a,跟时间复杂度的分析一样
ret += s * mu[d];
}
return ret / 2;
} int main ()
{
LL a, b; init();
scanf("%lld%lld", &a, &b);
printf("%lld\n", solve(b)-solve(a-1));
}

.

.

可写死我了

[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 最小公倍数计数【莫比乌斯反演】

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

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

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

  4. 51nod 1682 中位数计数

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

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

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

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

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

  7. 【51Nod 1222】最小公倍数计数

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1222 求\([a,b]\)中的个数转化为求\([1,b]\)中的个数减去 ...

  8. 51nod 1363 最小公倍数的和 欧拉函数+二进制枚举

    1363 最小公倍数之和 题目来源: SPOJ 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3 ...

  9. 51nod1222 最小公倍数计数

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

随机推荐

  1. Centos7下RabbitMQ的安装与配置

    具体按照步骤以此为准 第一步:安装最新版的erlang依赖 通过github设置版本号:https://github.com/rabbitmq/erlang-rpm vi /etc/yum.repos ...

  2. 使用Nginx的X-Accel-Redirect实现大文件下载

    在实现文件下载功能时通常有以下几种方式: 1.直接给出下载地址,例如http://****.com/test/test.rar,这种是最直接的方式,任何人都可以下载,无法控制用户的权限. 2.验证权限 ...

  3. ssm框架 pom的配置 / 还有里面springMVC.xml的配置 / webapp.xml的配置

    首先是pom的配置: <dependencies> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-jav ...

  4. Spring-Cloud之Zuul路由网关-6

    一.为什么需要Zuul? Zuul 作为微服务系统的网关组件,用于构建边界服务( Edge Service ),致力于动态路由.过滤.监控.弹性伸缩和安全.Zuul 作为路由网关组件,在微服务架构中有 ...

  5. angular复习笔记1-开篇

    前言 学习和使用angular已经有一段时间了.这段时间利用angular做了一个系统,算是对angular有了一个全面的认识,趁着现在有一些时间,把angular的一些知识记录一下. 安装angul ...

  6. python中ocr软件tesseract使用

    首先要看原版的参考 https://github.com/madmaze/pytesseract 直接上代码, import pytesseractfrom PIL import Image imag ...

  7. redux reducer笔记

    踩坑一,reducer过于抽象 reducer写得没那么抽象也不会有人怪你的.^_^ reducer其实只有一个,由不同的reducer composition出来的.所以, reducer的父作用域 ...

  8. JAVA基础之JavaEE与MVC

    所谓的架构.模式都是方便开发和查看的,分工明确的,理解每层的具体的意义! 一.JavaEE: 1.Java EE,Java 平台企业版(Java Platform Enterprise Edition ...

  9. session和cookie的区别和联系详解,Cookie Session相关看这篇就够了。

    本文转自:91博客:原文地址:http://www.9191boke.com/199015867.html 有一朋友做面试官的时候,曾经问过很多朋友这个问题: Cookie 和 Session 有什么 ...

  10. clipse调试web项目配置调试配置——没有Server

    文章:eclipse环境下如何配置tomcat(包含没有Server解决办法) 地址:https://blog.csdn.net/TimliangL/article/details/78882566