因数个数函数与因数和函数

d(n)d(n)d(n)表示n的因数的个数函数。σ(n)\sigma(n)σ(n)表示n的所有因数的和的函数。

积性

这两个函数都是积性函数。即gcd(a,b)=1⇒f(ab)=f(a)f(b)gcd(a,b)=1 \Rightarrow f(ab)=f(a)f(b)gcd(a,b)=1⇒f(ab)=f(a)f(b).

因数个数函数d(n)d(n)d(n)积性证明思路

对于因数个数函数d(n)d(n)d(n)只需要用质因数分解的唯一性公式对进行质因数分解,利用简单的组合数学的知识可以知道d(n)d(n)d(n)的数学表达式。
当gcd(a,b)=1gcd(a,b)=1gcd(a,b)=1时,说明aaa与bbb分解质因数后没有公共的素因子。将d(ab),d(a),d(b)d(ab),d(a),d(b)d(ab),d(a),d(b)分解用数学表达式表达出来容易证明d(ab)=d(a)d(b)d(ab)=d(a)d(b)d(ab)=d(a)d(b).

因数和函数σ(n)\sigma(n)σ(n)积性证明思路

这个稍微复杂一丢丢。
gcd(a,b)=1gcd(a,b)=1gcd(a,b)=1,即它们互质。
通过分解质因数的方法,容易说明:

  1. a,ba,ba,b集合各取一个因数,它们的乘积一定是ababab的因数。
  2. 容易证明ababab的因数一定可以分解为两个数的积,一个是aaa的因数,一个是bbb的因数。
    所以a,ba,ba,b各取一个因数ai,bja_i,b_jai​,bj​,就可以构造一个ababab的因数aiaja_ia_jai​aj​.上面两点可以保证了我们不会漏取。
    所以,剩下的工作就是说明不会重复即可。
    也就是要说明ai1bj1=ai2bj2a_{i_1}b_{j_1}=a_{i_2}b_{j_2}ai1​​bj1​​=ai2​​bj2​​成立当且仅当i1=i2且j1=j2i_1=i_2\text{且}j_1=j_2i1​=i2​且j1​=j2​。
    这个只需要利用a,ba,ba,b互质,有gcd(ai,bj)=1gcd(a_i,b_j)=1gcd(ai​,bj​)=1。
    然后由gcd(ai1,bj2)=1gcd(a_{i_1},b_{j_2})=1gcd(ai1​​,bj2​​)=1,得到bj2∣bj1b_{j_2} \mid b_{j_1}bj2​​∣bj1​​.
    同理gcd(ai2,bj1)=1gcd(a_{i_2},b_{j_1})=1gcd(ai2​​,bj1​​)=1,可以得到bj1∣bj2b_{j_1} \mid b_{j_2}bj1​​∣bj2​​.于是就迅速得到j1=j2j_1=j_2j1​=j2​.
    同理就可以得到i1=i2i_1=i_2i1​=i2​.
    这就说明不可能重复了。于是σ(ab)=∑i=1d(a)∑j=1d(b)(aibj)\sigma(ab)=\sum\limits_{i=1}^{d(a)}\sum\limits_{j=1}^{d(b)}\left(a_ib_j\right)σ(ab)=i=1∑d(a)​j=1∑d(b)​(ai​bj​)
    之后只需要用求和符号求和化简即可得到符合积性的结论。
    σ(ab)=∑i=1d(a)∑j=1d(b)(aibj)=∑i=1d(a)(ai∑j=1d(b)bj)=∑i=1d(a)(aiσ(b))=σ(b)∑i=1d(a)(ai)=σ(a)σ(b)\sigma(ab)=\sum\limits_{i=1}^{d(a)}\sum\limits_{j=1}^{d(b)}\left(a_ib_j\right)=\sum\limits_{i=1}^{d(a)}\left(a_i\sum\limits_{j=1}^{d(b)}b_j\right)=\sum\limits_{i=1}^{d(a)}\left(a_i\sigma(b)\right)=\sigma(b)\sum\limits_{i=1}^{d(a)}\left(a_i\right)=\sigma(a)\sigma(b)σ(ab)=i=1∑d(a)​j=1∑d(b)​(ai​bj​)=i=1∑d(a)​⎝⎛​ai​j=1∑d(b)​bj​⎠⎞​=i=1∑d(a)​(ai​σ(b))=σ(b)i=1∑d(a)​(ai​)=σ(a)σ(b)

说说这两个函数程序如何求值

对于个数函数,显然是分解质因数,获取各个素因子的指数,然后用那个数学表达式算了。
对于因数和函数,如果规模比较小,图方便的话,自然是暴力枚举,试除相加即可。
规模稍微大一点,就利用积性了,分成互质的数的乘积,然后分别算每一部分的因数和,最后相乘即可。
如何保证互质,分解质因数后的那个表达式,每个素因子连同指数当作一个数,不就两两互质了,而且σ(pk)\sigma(p^k)σ(pk)的还是一个等比数列求和.

d(n)d(n)d(n)的一个性质——d(n)=∑x∣a∑y∣b[gcd(x,y)=1]d(n)=\sum\limits_{x \mid a}\sum\limits_{y|b}\left[gcd(x,y)=1\right]d(n)=x∣a∑​y∣b∑​[gcd(x,y)=1]

假设我们n=abn=abn=ab,不要求a,ba,ba,b互质。
那么有d(n)=∑x∣a∑y∣b[gcd(x,y)=1]d(n)=\sum\limits_{x \mid a}\sum\limits_{y|b}\left[gcd(x,y)=1\right]d(n)=x∣a∑​y∣b∑​[gcd(x,y)=1].

怎么理解

即将nnn分解成n=abn=abn=ab,然后找有序对(x,y)(x,y)(x,y),x,yx,yx,y分别是a,ba,ba,b的因数,并且限制x,yx,yx,y互质。

为什么等号成立?

分解质因数,组合数学就知道了。
对于一个数来说,要构造一个因数,就是对分解质因数后的每个质因子选一个指数,有多少种选法就有多少个因数。
不同质因数选指数是独立的,适用乘法原理;对一个固定的质因子ppp,假设分解质因数形式里的指数是kkk,则构造因数时选取指数的范围是从000到kkk共k+1k+1k+1种。
现在我们将nnn分成a,ba,ba,b分成两部分了,
下面是个示意图,每个各自代表一个质数,红色的是aaa和bbb共有的质因子。绿色的是a含有而b不含有的素因子,蓝色的是b含有而a不含有的素因子。
我们给素因子选一个指数的时候就是往代表这个素因子的格子里填一个指数。
只是我们现在不是直接往nnn分解之后的格子里填数。而是先分别对a,ba,ba,b的分解后的格子里填数构造因数x,yx,yx,y.

对于红色格子,我们限定a,ba,ba,b填数的时候不能同时往同一个格子里填数。即对于同一个红色格子,那么只有以下可能:

  1. a和b都没有选,即都填了0
  2. a选了,填的是1,2,…,ka1,2,\ldots,k_a1,2,…,ka​中的一个;b没选,即填了0
  3. b没选,填了0;a没选,b选了,1,2,…,kb1,2,\ldots,k_b1,2,…,kb​中的一个
    于是a,ba,ba,b和b分开填对于这个红色格子,一共有1+ka+kb1+k_a+k_b1+ka​+kb​种可能。
    而n=abn=abn=ab直接分解往里面填数字的时候,对于这个红色格子,能填的范围刚好是0,1,2,3,…,ka+kb0,1,2,3,\ldots,k_a+k_b0,1,2,3,…,ka​+kb​共1+ka+kb1+k_a+k_b1+ka​+kb​种可能。
    显然,做了不能往同一个格子里填数的限制之后,所有方案是一样的,如果不做这个限制,就不能保证一样了
    对于绿色格子和蓝色格子,由于是各自独有的,显然a,ba,ba,b分别填和nnn直接分解填的方案数是一样的。
    所以最终方案数是一样的。

所以,我们只需要aaa和bbb分别填指数构造自己的因数x,yx,yx,y,统计填法的方案数即可,只是要保证不能对同一个素因子都填非零的指数即可。
那么怎么保证那么怎么保证那么怎么保证
如果他们选用了相同的素因子ppp,显然aaa构造出的因数xxx和yyy构造的因数就含有公约数ppp,所以只需要保证x,yx,yx,y互质即可。

因数个数函数与因数和函数相关推荐

  1. 关于一个数的因数个数 与 所有因数的和

    1. 暴力拆解 n为所要处理的数 int c=0,s=0;     //记录个数与和 for(int i=1;i*i<=n;i++){ if(n%i==0){ c+=2; s=s+i+s/i;  ...

  2. 利用线性筛算法框架求解因数个数以及因数和问题

    利用线性筛算法框架求解因数个数以及因数和问题 一 前言 关于线性筛算法,在前一篇文章 利用线性筛以及素数筛求某一范围内的所有素数中已经介绍过,若读者对线性筛算法不太了解或有所遗忘,可以点击链接查看.此 ...

  3. 知识点 - 因数之和 因数个数公式

    知识点 - 因数之和 因数个数公式 解决问题类型: 问有几个因数,因数之和, 或者问某些特定约数之和,比如不能被大于4的平方数整除的约数之和(即质因数的次数都为1) 结论 若对 nnn 质因数分解得到 ...

  4. ACMNO.23 C语言-素数判定 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime

    题目描述 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息. 输入 一个数 输出 如果是素数输出prime 如果不是输出not prime 样例输入 97 样例输出 prime 来源/ ...

  5. pandas使用query函数和sample函数、使用query函数筛选dataframe中的特定数据行并使用sample函数获取指定个数的随机抽样数据

    pandas使用query函数和sample函数.使用query函数筛选dataframe中的特定数据行并使用sample函数获取指定个数的随机抽样数据(query dataframe and ran ...

  6. 牛客练习赛25 因数个数和

    题目链接 题目描述 q次询问,每次给一个x,问1到x的因数个数的和. 输入描述: 第一行一个正整数q : 接下来q行,每行一个正整数 x 输出描述: 共q行,每行一个正整数表示答案 示例1 输入 4 ...

  7. bzoj 1053: [HAOI2007]反素数ant 51nod-1060:最复杂的数(反素数与因数个数计算)

    问题概述:把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数. 例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6.如果有多个数复杂度相等, ...

  8. C语言编程>第十周 ⑦ 请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行……

    例题:请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回.一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始和结尾都没有空格. 请勿改 ...

  9. 因数和以及因数个数和问题

    首先因数的定义:   因数是指整数 a 除以整数 b ( b≠0 ) 的商正好是整数而没有余数,我们就说 b 是 a 的因数. 问题一:区间因数和 描述:求解 [L,R] 区间内所有的因数之和,R & ...

最新文章

  1. Content Provide详解
  2. 享元模式(FlyWeight)
  3. 本文把TCP/IP讲绝了!
  4. 在Winform中播放视频等【DotNet,C#】
  5. 【线上分享】基于CDN边缘网络智能优化图片和视频
  6. 又一中国机械狗来了:腾跃呼啦圈、原地起跳顶飞皮球,还能自主充电
  7. 学习进行中,快over了
  8. 第五章——微型计算机与外设的数据传输
  9. Boost Asio Examples(整理)
  10. 解析UML箭头、线条代表的意义
  11. 推荐 :数据科学研究的现状与趋势
  12. python惰性求值例子_惰性求值和yield-Python
  13. 一生当修炼这十样品质
  14. 程序员必备狂拽炫酷吊炸天的动效神器
  15. 如何做好项目管理,实现高效的项目管理?
  16. LZO和MiniLZO编码介绍
  17. NVR和DVR的详细区别
  18. 小米笔记本电脑触摸板失灵解决方案
  19. 智慧管廊综合管理系统设计方案
  20. 基础地理信息术语(a-b-c-d-e-f-g-h-i-k-l-m-n-o-t-u-v-w-x-y-z)

热门文章

  1. 微软官方720P、1080P高清测试视频短片下载
  2. JS Undefined类型
  3. 我眼中未来的计算机资料,我心目中未来的计算机
  4. Unity Ulua基础
  5. 颜色的前世今生1·一切从光开始
  6. 计算机辅助英语教学中的教学法原则,计算机英语教学中应做到以学生为中心的教学原则...
  7. GRE的issue写作要求
  8. mobi文件怎么转化为PDF?这个方法可以试试看
  9. 迷宫路线寻找算法的matlab仿真
  10. html右侧悬浮侧边栏,jQuery页面侧边固定悬浮导航代码(带关闭按钮)