• 约数个数定理&约数和定理


    1、如果我们要求一个数的所有因数的个数会怎么去求呢?

    首先想到最简单的方法就是暴力求解就可以。当然数据小、或者测试数据少就很简单就可以过了。

    2、如果求一个区间内的数的所有因数的个数呢?或者求一个区间内的数的因数最大的数以及最大的因数(正因数)的个数?

    这样的话,数据大一些,组数多一些,可能就要Tle,所以可以想到用唯一分解定理,但是那是适用于分解成素因数,要怎么转化呢?

    这就需要用到了约数个数定理。

    约数个数定理

    对于一个大于1正整数n可以分解质因数:

       

    则n的正约数的个数就是   

       

    其中a1、a2、a3…ak是p1、p2、p3,…pk的指数。

    (在证明上自己自行百度搜索就可以了。qwq)

    3、如果我们需要求这个区间内具有最大个数因数的这个数的所有因数之和怎么办呢?

    因为刚刚是按素因数来分解的,如果只是加上相应的次方数,肯定是不对的,那么要怎么解决这个问题呢,当时想了好久,不过脑子笨,采用各种暴力,当然也有成效,不过还是看看下面这个方法吧。

    约数和定理

    对于一个大于1正整数n可以分解质因数:n=p1^a1*p2^a2*p3^a3*…*pk^ak,

    则由约数个数定理可知n的正约数有(a₁+1)(a₂+1)(a₃+1)…(ak+1)个,

    那么n的(a₁+1)(a₂+1)(a₃+1)…(ak+1)个正约数的和为

    f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)。

    这个公式蛮好理解,但是要怎么去实现呢?

    先把素因子存起来,再把幂指数存起来,最后依次加上,这样的方法当然可以,但是总归比较麻烦。

    来看一下这个定理:设正整数n有素因子分解 n =(p1^α1)*(p2^α2)*(p3^α3)* ....... *(pk^αk),那么

               所有因数和  σ(n)=[(p1^α1)-1 ] /(p1-1) * [(p2^α2)-1 ] / (p2-1) * .....  *[(pk^αk)-1 ]/(pk-1)

    那么在每次遍历到该因数数,直接算一下累加起来就可以了。

    代码板子回来再写QAQ.

    参考文献:百度百科等网络资料加上自己理解。

  • 相关阅读:
    C++ 知识回顾总结 -- queue 队列容器
    C++标准模板库(STL)之Stack
    c++优先队列(priority_queue)用法详解
    数组中超过一半的数
    【LeetCode】93. Restore IP Addresses 【面试题】
    atoi()和stoi()的区别----数字字符串的处理
    C++中substr函数的用法
    基本排序算法 【转载】
    平衡数
    python中Sting字符串
  • 原文地址:https://www.cnblogs.com/lcchy/p/10139613.html
Copyright © 2020-2023  润新知