zoukankan      html  css  js  c++  java
  • SSLZYC 约束和

    题目大意:
    求一个数所有约数的和。


    思路:
    很明显是一道暴力模拟的题目。
    由于数据很大,所以寻找约数时要用trunc(sqrt(n))
    只要从1到trunc(sqrt(n))枚举i,找到一个约数就让sum加上i和(n/i)
    注意:千万小心完全平方数!它们的i和n/i有可能相同!这时只需要加上其中一个就可以了!


    代码:

    #include <cstdio>
    #include <iostream>
    #include <cmath>
    using namespace std;
    int a[5000001]; 
    int n,m,sum;
    int main()
    {
        scanf("%d",&n);  //n组数据
        for (int i=1;i<=n;i++)
        {
            sum=0;
            scanf("%d",&m);
            if (a[m]!=0)   //剪枝。如果已经算出m的约束和,就直接输出。
            {
                printf("%d\n",a[m]);
                continue;
            }
            for (int i=1;i<=(int)(sqrt(m));i++)  //枚举
            {
                if (m%i==0)   //如果i是m的约束
                {
                    sum+=i;
                    if (m/i!=i) sum+=m/i;  //判断是否是完全平方数,如果不是,就加上m/i。
                }
            }
            a[m]=sum;  //剪枝专用
            printf("%d\n",sum);
        }
        return 0;
    }
  • 相关阅读:
    .NET-记一次架构优化实战与方案-梳理篇
    .net core实践系列之SSO-跨域实现
    Vue
    C# WPF
    开源框架
    开源框架
    开源框架
    开源框架
    WCF
    WCF
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313107.html
Copyright © 2011-2022 走看看