【数学】【P5150】 生日礼物
Description
给定 \(n\),求
\]
input
一行一个整数代表 \(n\)
Output
一行一个整数代表答案
Hint
\(1~\leq~n~\leq~10^{16}\)
Solution
一开始看到这个形式以为是反演,然后看到数据范围就自闭了……
然后发现这是个唯一分解定理题……
吐槽一下标算 \(O(\sqrt{n})\) 暴力卡常 范围出1e16也太[数据删除]了吧(大雾
然后用py写了一发和标算差不多的暴力,惨遭卡常
所以这里来提供一种 \(O(\sqrt[3]{n})\) 的方法!
其实就是讨论里 @mrsrz 神仙的第一种踩标算做法
设
\]
\]
\]
其中 \(p\) 为质数。
则显然有
\]
我们考虑固定 \(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)\)。根据乘法原理,总方案数为
\]
于是 \(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】 生日礼物的更多相关文章
- 洛谷 P5150 生日礼物 题解
		题面 因为 n=lcm(a,b)n = lcm(a, b)n=lcm(a,b) ,可以得出: a 和 b 的质因数都是 n 的质因数 对于 n 的每个质因数 x ,在 n 中的次数为 y ,那么 ... 
- 数学思想:为何我们把 x²读作x平方
		要弄清楚这个问题,我们得先认识一个人.古希腊大数学家 欧多克索斯,其在整个古代仅次于阿基米德,是一位天文学家.医生.几何学家.立法家和地理学家. 为何我们把 x²读作x平方呢? 古希腊时代,越来越多的 ... 
- 速算1/Sqrt(x)背后的数学原理
		概述 平方根倒数速算法,是用于快速计算1/Sqrt(x)的值的一种算法,在这里x需取符合IEEE 754标准格式的32位正浮点数.让我们先来看这段代码: float Q_rsqrt( float nu ... 
- MarkDown+LaTex  数学内容编辑样例收集
		$\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ... 
- 深度学习笔记——PCA原理与数学推倒详解
		PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多, ... 
- Sql Server函数全解<二>数学函数
		阅读目录 1.绝对值函数ABS(x)和返回圆周率的函数PI() 2.平方根函数SQRT(x) 3.获取随机函数的函数RAND()和RAND(x) 4.四舍五入函数ROUND(x,y) 5.符号函数SI ... 
- *HDU 2451 数学
		Simple Addition Expression Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ... 
- 如何解决Maple的应用在数学中
		对任意数学和技术学科的研究员.教师和学生而言,Maple是一个必备的工具.通过Maple,教师将复杂数学问题注入生命,学生的精力集中在概念理解上而不是如何使用工具上,研究员可以开发更复杂的算法或模型. ... 
- 如何让Maple中的数学引擎进入你的桌面应用程序和网站
		MapleNET数学服务套件将Maple 2015强大的数学引擎引入您的应用程序和网站.使用MapleNET,您可以添加数学计算和可视化功能到网页和桌面程序中,通过互联网/局域网分享“活”的Maple ... 
随机推荐
- 初学node.js-npm使用(2)
			1.安装Node封装模块 安装Node封装模块很重要,因为开发项目中会用到各种各样的功能,这时就需要去下载开源的模块 使用npm install <module_name> module_ ... 
- 02_python内置模块_timeit
			timeit模块可以用来测试一小段python代码的执行速度. (1)timeit.Timer(stmt='pass', setup='pass', timer=<timer function& ... 
- 小刘的深度学习---Faster RCNN
			前言: 对于目标检测Faster RCNN有着广泛的应用,其性能更是远超传统的方法. 正文: R-CNN(第一个成功在目标检测上应用的深度学习的算法) 从名字上可以看出R-CNN是 Faster RC ... 
- ubuntu下import matplotlib错误解决办法
			环境:ubuntu16.04,python2.7,tensorflow1.4.0 问题: ImportError: No moudule named _tkinter, please install ... 
- Gdiplus的使用
			使用步骤: 1.包括相应的头文件及引入相应的lib #include <GdiPlus.h> #pragma comment(lib, "gdiplus.lib") u ... 
- 团队博客作业Week4 --- 学霸网站--NABC
			1.需求(Need) 伴随着经济的发展,科学技术取得了飞速的发展,互联网在各行各业的发展中取得了广泛的应用.随着这些事物的发展,我们每个人都会接触到相当庞大的数据.如何在这些数据中找到自己需要的,如何 ... 
- 2-Third Scrum Meeting-20151203
			任务安排 闫昊: 今日完成:请假.(编译+计组,压力有点大) 明日任务:设计本地数据库. 唐彬: 今日完成:请假.(编译+计组,压力有点大) 明日任务:阅读ios客户端代码. 史烨轩: 今日完成:请假 ... 
- OO学习总结与体会
			前言 经过了对于面向对象程序设计的一个月的学习,我初尝了JAVA以及面向对象程序的魅力.经历了三次难度逐渐加大的课后编程作业,我对于工程化面向对象编程以及调试有了深刻的认识与颇多感想.我写下本篇文章以 ... 
- printf in KEIL C51
			转自:http://blog.csdn.net/it1988888/article/details/8821713 在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化 ... 
- React监听窗口变化事件
			功能说明:本例子采用MUI table组件 + React实现. 需求描述:固定表头,列表高度随浏览器窗口的改变而改变.(本例中当窗口高度小于472像素后,便不作限制) 实现简介:1.监听浏览器窗口, ... 
