• 约数相关问题


    <1>求所有约数

    869. 试除法求约数 - AcWing题库

    AC代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int n;
    7. int main()
    8. {
    9. cin>>n;
    10. while(n--)
    11. {
    12. vector<int>v;
    13. int x;
    14. cin>>x;
    15. for(int i=1;i<=x/i;i++)
    16. {
    17. if(x%i==0)
    18. {
    19. v.push_back(i);
    20. if(i!=x/i)v.push_back(x/i);
    21. }
    22. }
    23. sort(v.begin(),v.end());
    24. for(auto item:v)
    25. cout<" ";
    26. cout<
    27. }
    28. return 0;
    29. }

    相关解释:

    这里就枚举2到根号x的范围就可以了,最后要排个序。

    注意这里要特别判断一下i和n/i是否相等,不然可能会重复。

    <2>求约数的个数

    870. 约数个数 - AcWing题库

    AC代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int mod = 1e9+7;
    7. int n;
    8. int main()
    9. {
    10. cin>>n;
    11. unordered_map<int,int>hash;
    12. while(n--)
    13. {
    14. int x;
    15. cin>>x;
    16. for(int i=2;i<=x/i;i++)
    17. {
    18. while(x%i==0)
    19. {
    20. hash[i]++;
    21. x/=i;
    22. }
    23. }
    24. if(x>1)hash[x]++;
    25. }
    26. long long res=1;
    27. for(auto item:hash)
    28. {
    29. res=(res*(item.second+1))%mod;
    30. }
    31. cout<
    32. return 0;
    33. }

    相关解释:

    这里使用算术基本定理(如果不知道,可以去百度),采用算术基本定理可以把所有的数分解。这题对所有的数进行分解,用什么记录呢?显然可以采用hash表来记录,如果不知道,可以看我的这篇博客STL map和unordered_map容器详解-CSDN博客。根据算法基本定理的分解式,假设分解成了p1^k1 * p2^k2 * p3*k3 * ... * pn^kn。所有这些指数k1,k2..,kn的不同选法也就构成了不同的约数,全选是最大的,与就是本身,都不选,也就是1.所以有(k1+1)*(k2+1)*..*(kn+1)种选法,也就是有这些种约数。由于可能足够大,res采用long long类型。

    <3>求约数之和

    871. 约数之和 - AcWing题库

    AC代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. const int mod = 1e9+7;
    8. int n;
    9. int main()
    10. {
    11. cin>>n;
    12. unordered_map<int,int>hash;
    13. while(n--)
    14. {
    15. int x;
    16. cin>>x;
    17. for(int i=2;i<=x/i;i++)
    18. {
    19. while(x%i==0)
    20. {
    21. hash[i]++;
    22. x/=i;
    23. }
    24. }
    25. if(x>1)hash[x]++;
    26. }
    27. long long res=1;
    28. for(auto item:hash)
    29. {
    30. long long t=1;
    31. int p=item.first,k=item.second;
    32. while(k--)
    33. {
    34. t=(t*p+1)%mod;
    35. }
    36. res=res*t%mod;
    37. }
    38. cout<
    39. return 0;
    40. }

    相关解释:

    求约数之和一样的道理,采用算术基本定理将所有这些数进行分解,使用hash表来存储底数和指数。最后的约数之和应该是(p1^0+p1^1+...+p1^k1) * (p2^0+p2^1+...+p2^k2) * ... * (pn^0+pn^1+...+pn^kn)。为什么是这样呢,因为所有从这些括号里选择一个数,这些数相乘也就构成了某个约数,所有这些数相加也就是最后的约数之和!

    <4>求最大公约数

    872. 最大公约数 - AcWing题库

    AC‘代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int n;
    6. int gcd(int a,int b)
    7. {
    8. return b?gcd(b,a%b):a;
    9. }
    10. int main()
    11. {
    12. cin>>n;
    13. while(n--)
    14. {
    15. int a,b;
    16. cin>>a>>b;
    17. cout<<gcd(a,b)<
    18. }
    19. return 0;
    20. }

    相关解释:

    这里采用欧几里得算法(也是辗转相除法),不知道的可以百度。注意这里不需要看谁大谁小,代码也很少,非常简便。

  • 相关阅读:
    目标检测——食品饮料数据集
    List介绍
    【场景生成与研究】考虑时序相关性MC的场景生成与削减研究(Matlab代码实现)
    A - Turn the Rectangles
    mysql添加用户以及设置权限
    git cherry-pick 合并某次提交
    社交网络中的身份和搜索 论文阅读
    管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程
    Java中代理的实现方式
    Flowable钉钉对接005-完成钉钉任务
  • 原文地址:https://blog.csdn.net/wsywsyyy/article/details/133488920