Description

给定 \(n\),求

\[\sum_{i}~\sum_j~[lcm(i,j)~=~n]
\]

input

一行一个整数代表 \(n\)

Output

一行一个整数代表答案

Hint

\(1~\leq~n~\leq~10^{16}\)

Solution

一开始看到这个形式以为是反演,然后看到数据范围就自闭了……

然后发现这是个唯一分解定理题……

吐槽一下标算 \(O(\sqrt{n})\) 暴力卡常 范围出1e16也太[数据删除]了吧(大雾

然后用py写了一发和标算差不多的暴力,惨遭卡常

所以这里来提供一种 \(O(\sqrt[3]{n})\) 的方法!

其实就是讨论里 @mrsrz 神仙的第一种踩标算做法

\[n~=~\prod_{i = 1}^{k} p_i^{c_i}
\]

\[x~=~\prod_{i = 1}^k p_i^{d_i}
\]

\[y~=~\prod_{i = 1}^{k}~p_{i}^{e_i}
\]

其中 \(p\) 为质数。

则显然有

\[lcm(x, y)~=~n~\Leftrightarrow~\forall~i~\in~[1,k],c_i~=~\max(d_i,e_i)
\]

我们考虑固定 \(x\) 第 \(i\) 位指数即 \(d_i~=~c_i\),则 \(e_i\) 选 \([0,c_i]\) 都是合法的,共 \(c_i~+~1\) 中选法。将 \(x,y\) 反过来同样成立。但是注意固定 \(d_i~=~c_i\) 时令 \(e_i~=~c_i\) 的选法和反过来是一样的,于是要把这个方案扣除 \(1\)。

所以对于第 \(i\) 个质因子的方案数为 \((2~\times c_i~+~1)\)。根据乘法原理,总方案数为

\[\prod_{i = 1}^{k}~(2~\times~c_i~+~1)
\]

于是 \(O(\sqrt{n})\) 分解一下,发现py被卡常了。我们考虑一种更优秀的做法:

我们在分解质因数时,分解到 \(\sqrt[3]{n}\),即当 \(i^3~>~n\) 时停止。考虑现在 \(n\) 除掉已经筛出的质因子后剩下的值共有如下几种情况:

剩下 \(1\):这种情况对答案无贡献,无需理会

剩下的数是一个质数:显然这个剩下的数是 \(n\) 的最后一个质因子,并且指数显然为 \(1\),于是直接将答案乘 \(3\) 即可

考虑除去这两种情况外,剩下的数只能是两个质数的积,而不可能是更多质数的积。

证明上,可以设剩下的最小的质数是 \(p\),则有 \(p~>~\sqrt[3]{n}\),假设是 \(k\) 个质数的乘积,那么显然有剩下的数字 \(dn~\geq~p^k\)。由于 \(p^3~>~(\sqrt[3]{n})^3~=~n\),\(dn~\leq~n\),则在 \(k~\geq~3\) 时产生矛盾,于是 \(k~\leq~2\)。

再分两种情况:

剩下的数是一个质数的平方:直接将答案乘 \(5\) 即可

否则一定是两个质数相乘。考虑每个质数贡献 \(3\),所以将答案乘上 \(9\) 即可。

考虑如何快速判断剩下的数字是一个质数:直接进行米勒拉宾质数判定,时间复杂度 \(O(\log n)\)。

考虑不损失精度的判断一个数是一个完全平方数:直接进行二分开方,时间复杂度 \(O(\log n)\)

于是总时间复杂度 \(O(\sqrt[3]{n})\),踩爆标算

Code

def mpow(x, y, p):
_ret, _temp = 1, x
while y:
if y & 1:
_ret = _ret * _temp % p
_temp = _temp * _temp % p
y >>= 1
return _ret def ML(x, n):
if n == x: return 1
sn = n - 1
s, d = n - 1, 0
while not (s & 1):
s >>= 1
d += 1
t = mpow(x, s, n)
if t == 1 or t == -1: return 1
for i in range(d):
if t == sn: return 1
t = t * t % n
return 0 def IsPrime(x):
if not (x & 1):
if x == 2: return 1
else: return 0
elif not ML(2, x): return 0
elif not ML(7, x): return 0
elif not ML(61, x): return 0
else: return 1 def IsPow(x):
l, r, mid, = 1, x, 0
while l <= r:
mid = (l + r) >> 1
k = mid * mid
if k < x: l = mid + 1
elif k == x: return 1
else: r = mid - 1
return 0 n = int(input()) ans, i, dn = 1, 2, n while (i * i * i) <= n:
if (dn % i) == 0:
cnt = 0
while (dn % i) == 0:
dn //= i
cnt += 1
ans *= (cnt << 1) + 1
i += 1
if dn != 1:
if IsPrime(dn):
ans *= 3
elif IsPow(dn):
ans *= 5
else:
ans *= 9 print(ans)

【数学】【P5150】 生日礼物的更多相关文章

  1. 洛谷 P5150 生日礼物 题解

    题面 因为 n=lcm(a,b)n = lcm(a, b)n=lcm(a,b) ,可以得出: a  和 b  的质因数都是 n 的质因数 对于 n  的每个质因数 x ,在 n 中的次数为 y ,那么 ...

  2. 数学思想:为何我们把 x²读作x平方

    要弄清楚这个问题,我们得先认识一个人.古希腊大数学家 欧多克索斯,其在整个古代仅次于阿基米德,是一位天文学家.医生.几何学家.立法家和地理学家. 为何我们把 x²读作x平方呢? 古希腊时代,越来越多的 ...

  3. 速算1/Sqrt(x)背后的数学原理

    概述 平方根倒数速算法,是用于快速计算1/Sqrt(x)的值的一种算法,在这里x需取符合IEEE 754标准格式的32位正浮点数.让我们先来看这段代码: float Q_rsqrt( float nu ...

  4. MarkDown+LaTex 数学内容编辑样例收集

    $\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ...

  5. 深度学习笔记——PCA原理与数学推倒详解

    PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多, ...

  6. Sql Server函数全解<二>数学函数

    阅读目录 1.绝对值函数ABS(x)和返回圆周率的函数PI() 2.平方根函数SQRT(x) 3.获取随机函数的函数RAND()和RAND(x) 4.四舍五入函数ROUND(x,y) 5.符号函数SI ...

  7. *HDU 2451 数学

    Simple Addition Expression Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  8. 如何解决Maple的应用在数学中

    对任意数学和技术学科的研究员.教师和学生而言,Maple是一个必备的工具.通过Maple,教师将复杂数学问题注入生命,学生的精力集中在概念理解上而不是如何使用工具上,研究员可以开发更复杂的算法或模型. ...

  9. 如何让Maple中的数学引擎进入你的桌面应用程序和网站

    MapleNET数学服务套件将Maple 2015强大的数学引擎引入您的应用程序和网站.使用MapleNET,您可以添加数学计算和可视化功能到网页和桌面程序中,通过互联网/局域网分享“活”的Maple ...

随机推荐

  1. [转载]GB2312简体中文编码表

    编码表源地址:http://www.knowsky.com/resource/gb2312tbl.htm编码在线查询:http://www.qqxiuzi.cn/bianma/zifuji.phpGB ...

  2. 为什么找程序员一定要看他的 GitHub

    听说 最开始听到这句话是某知名互联网公司大牛告诉我的,我很不以为然,不过迫于他是"leader"我也注册了一个 highsea (广告 0.0):当然我可懒得 push 更别提 c ...

  3. (第十一周)Beta—review阶段成员贡献分

    项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...

  4. No.1011_第八次团队会议

    罗老师和Bigman助教: 一直以来没看博客页面,我们的博客负责人不是没写博客,而是不小心把博客发到草稿上了.. 请您再次看一下我们的博客,并批评指正! 今天大家的情绪依旧很低落,离第一轮迭代完成距离 ...

  5. 20172321 2017-2018-2《Java程序设计》第三周学习总结

    20172321 2017-2018-2<Java程序设计>第三周学习总结 教材学习内容总结 第三章要点: 要点1 :String类.Random类.Math类和枚举型,这几个是很有用的并 ...

  6. js弹出框 -搜索

    警告框alert() alert是警告框,只有一个按钮“确定”无返回值,警告框经常用于确保用户可以得到某些信息.当警告框出现后,用户需要点击确定按钮才能继续进行操作.语法:alert("文本 ...

  7. hive-2.3.3安装

    1.下载hive-2.3.3 下载地址 http://archive.apache.org/dist/hive/hive-2.3.3 解压,编辑/etc/profile添加HIVE_HOME,保存文件 ...

  8. 《Spring1之第七次站立会议》

    <第七次站立会议> 昨天:我把自己项目工程里的服务器端界面进行了优化和完善. 今天:我查找了关于实现视频功能的相关代码. 遇到的问题:找到的都是基于C#的相关代码,很难找到用java实现的 ...

  9. week4b:个人博客作业

    下面是week4做程序的过程. 1.在做之前先做客户需求,要求使用的使用mul图. 自己第一次听到这个名字,网上查UML为, http://www.cnblogs.com/wangkangluo1/a ...

  10. 深入理解Java类加载器(3)

    5.2 网络类加载器 下面将通过一个网络类加载器来说明如何通过类加载器来实现组件的动态更新.即基本的场景是:Java 字节代码(.class)文件存放在服务器上,客户端通过网络的方式获取字节代码并执行 ...