关于神奇的约数的基础合集

好啦,之前我们学了数论的一个基础概念:质数,同时也学了一些与质数相关的基本操作的算法实现方法,那么今天我们就来学一下数论的另一个基础概念:约数。
当然,约数的运用和质数还是有许许多多牵连的,所以还不会质数的小伙伴,可以先去康康这个鸭qwq
关于可爱的质数的基础合集
那么接下来,就让我们一起来看看,什么是约数,而它又有一些怎样的神奇操作把!

1.约数的概念

约数的概念应该不会有人忘记吧,和质数一样,也是小学就学过的概念,而且时时刻刻穿插在我们的数学学习生活中,比起质数运用的频率要高了许多,也更不容易忘记,不过为了内容的完整性还是写一下吧QwQ
对于一个整数N,如果有一个整数d可以将N整除,则d就是N的一个约数,也称N的因数。
好了,这就是约数的概念啦。那么接下来我们了解约数,和了解质数一样,从最最简单的操作开始。

2.试除法求约数

想要了解约数,那就得先找到约数。那么对于给定的任意一个数n,我们应该怎么找到它的约数呢?嘿嘿,相信康到标题的小可爱都已经知道了。
没错!!!又是试除法,它又双叒叕来了!!!
思路大家应该都懂的吧,从1到n进行枚举,能与n整除的数就是n的约数。
不过同样的,如果在不优化的情况下,我们这样寻找质数的时间复杂度是O(n)的,我们同样可以用优化查质数的思路把它的时间复杂度优化成O(sqrt(n)),优化的思路我在质数的时候都写过了,这里就直接来康康优化过后的代码吧。

vector<int> found(int n)
{
   
	vector<int> res;
	for(int i = 1; i <= n / i; i ++)
	{
   
		if(n % i == 0) res.push_back(i);
		if(n / i != i) res.push_back(n / i); // 这里防止重复加
	}
	return res;
}

这个板子的思路并不难,也就不放题目了,我们直接下一个QwQ

2. 约数的个数

<1>思路模板

随意给定一个数N,我们如何快速的求出约数的个数呢?
当然,我们用上面的那个方法是一定可以求出来的。但是,我们只用求出约数的个数耶,好似不用一个一个来算呀,那么有没有什么好的办法,比如有没有啥公式可以一步算出来呢?
答案是。。。当然有的!
我们已经知道了,对于任意一个数N,我们可以写成N = p1 ^ a1 * p2 ^ a2 * …
. * pk ^ ak 的形式,那么,N的约数个数T = (a1 + 1) * (a2 + 1) * … * (ak + 1)
那么这个公式是怎么来的呢?我们假设N有一个约数W, 那么对于W,我们一定有W = p1 ^ b1 * p2 ^ b2 * … * pk ^ bk,对于bi,它的取值范围一定是0 <= bi <= ai。
这就变成了排列组合的问题,对于每一个质数pi,它的指数都有0到ai这(ai + 1)种选择,所以这个数总的约数格式也就是每个质数的指数的选择个数的乘积,也就是上面的公式。
我们来一起康康代码的实现吧QwQ

int num(int n)
{
   
	unordered_map<int, int> hash;
	for(int i = 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值