C++ 如何有效地得到给定范围内的除数之和?

C++ 如何有效地得到给定范围内的除数之和?,c++,algorithm,time-complexity,C++,Algorithm,Time Complexity,我试图找到给定范围a,ba中c的所有除数之和注:问题不清楚我们是需要除数(在描述中)还是可除整数(在代码示例中)。答案总结了可分割的项目 这很简单 从中查找,使从%c==0&&from>=a的最小值 查找to,最大值,以便to%c==0&&to注意:问题不清楚我们是否需要求和除数(在说明中)或可除整数(在代码示例中)。答案总结了可分割的项目 这很简单 从中查找,使从%c==0&&from>=a的最小值 找到to,最大值,以便to%c==0&&to首先识别所有作为c的除数的素数。这将给您留下一

我试图找到给定范围a,ba中
c
的所有除数之和注:问题不清楚我们是需要除数(在描述中)还是可除整数(在代码示例中)。答案总结了可分割的项目

这很简单

  • 从中查找
    ,使
    从%c==0&&from>=a的最小值

  • 查找
    to
    ,最大值,以便
    to%c==0&&to注意:问题不清楚我们是否需要求和除数(在说明中)或可除整数(在代码示例中)。答案总结了可分割的项目

    这很简单

    中查找
    ,使
    从%c==0&&from>=a的最小值

  • 找到
    to
    ,最大值,以便
    to%c==0&&to首先识别所有作为c的除数的素数。这将给您留下一个数字列表[w,x,y,z…]。然后保留一个哈希表集,其中包含该列表中所有整数的倍数,这些整数也是除数

    int a, b, c;
    cin >> a >> b >> c;
    long long sum = 0;
    
    std::vector<int> all_prime_factors = // Get all prime factors of c
    std::unordered_set<int> factorSet;
    for (int primefactor : all_prime_factors)
    {
        int factor = primefactor;
        while (factor <= b)
        {
            if (factor % c == 0)
                factorSet.insert(factor);
            factor += primefactor;
        }
    }
    
    for (int x : factorSet)
    {
        sum += x;
    }
    
    cout << sum << endl;
    
    inta、b、c;
    cin>>a>>b>>c;
    长和=0;
    std::vector all_prime_factors=//获取c的所有素数因子
    std::无序集因子集;
    for(整型素数因子:所有素数因子)
    {
    int因子=基本因子;
    
    while(factor首先确定所有作为c的除数的素数。这将给您留下一个数字列表[w,x,y,z…]。然后保留一个哈希表集,该列表中所有整数的倍数也是除数

    int a, b, c;
    cin >> a >> b >> c;
    long long sum = 0;
    
    std::vector<int> all_prime_factors = // Get all prime factors of c
    std::unordered_set<int> factorSet;
    for (int primefactor : all_prime_factors)
    {
        int factor = primefactor;
        while (factor <= b)
        {
            if (factor % c == 0)
                factorSet.insert(factor);
            factor += primefactor;
        }
    }
    
    for (int x : factorSet)
    {
        sum += x;
    }
    
    cout << sum << endl;
    
    inta、b、c;
    cin>>a>>b>>c;
    长和=0;
    std::vector all_prime_factors=//获取c的所有素数因子
    std::无序集因子集;
    for(整型素数因子:所有素数因子)
    {
    int因子=基本因子;
    
    (因子)你可以尝试找到<代码> C< <代码>的素数分解,然后从它们中导出所有可能的除数(范围<代码> [a,b] < /代码>)。(例如,如果您将任何因子与任何其他因子配对,4将多次出现,且素因子分解为2、2、2)。@Aconcagua“工作”如果您没有指定接受标准,则是一个主观形容词。在这里,OP清楚地说明了它们的实现性能不够:然后需要更正。这是主题。如果您不确定,可以询问它。您可以尝试找到
    c
    的素因子分解,然后导出所有可能的因子(范围
    [a,b]这是非常复杂的……而且你需要考虑可能的重复(例如,如果你与任何其他因素配对,4将出现2, 2, 2倍的素数分解)。@阿空加瓜山“工作”如果你没有指定接受标准,这是一个主观形容词。在这里,OP清楚地说明了它们的实现不够好:然后需要更正。这是主题。如果你不确定,你可以问它。你确定没有乘法吗?c=6,a=5,b=30->from=6,to=30->to+c=30-6+6=30;n可分割的数字:6,12,18,24,30,和是90。@Aconcagua Fixed你确定没有缺少乘法吗?c=6,a=5,b=30->from=6,to=30->from+c=30-6+6=30;可分割的数字:6,12,18,24,30,和是90。@Aconcagua Fixed你能更快吗?首先,在集合中添加任何素数,然后再添加两个p的任何乘积素数因子,然后是3中的任何一个,然后……当然,这不是小事——而得到素数因子则不同:虽然最初的方法更倾向于避免重复,但这一方法需要保留重复项……为什么对于a=12,b=18,c=6,它打印12?无论我多么努力地解释这个问题,这个结果对于用factor+=primefactor
    这在O((b-a)*log(c)/log(c)中运行。这比O(1)的替代实现慢得多你能更快吗?首先,向集合中添加任何素数因子,然后添加两个素数因子的任何乘积,然后添加三个素数因子中的任何一个,然后…当然,这不是很简单-获得素数因子会有所不同:虽然最初的方法更倾向于避免重复,但这个方法需要保留重复项…为什么a=12,b=18,c=6会打印12?没有无论我多么努力地解释这个问题,这个结果对于用
    factor+=primefactor
    来测量修复没有意义,它在O((b-a)*log(c)/log(c)中运行。这比O(1)的替代实现慢得多。
    if (c < 0) c *= -1;  // works unless c == MIN_INT
    if (a % c == 0)
       from = a;
    else if (a >= 0)
       from = (a / c * c) + c
    else 
       from = a / c * c;
    
    int a, b, c;
    std::cin >> a >> b >> c;
    if (!std::cin) {
       std::cout << "input error\n";
       return 0;
    }
    
    if (c < 0) c*= -1;
    const int from = [a,c] {
    
       // no rounding needed
       if (a % c == 0) return a;
    
       // division rounds down to zero
       if (a > 0) return (1 + a / c) * c;
    
       // division rounds up to zero
       return a / c * c;
    }();
    
    const int to = [b,c] {
    
       // no rounding needed
       if (b % c == 0) return b;
    
       // division rounds down to zero
       if (b > 0) return (b / c) * c;
    
       // division rounds up to zero
       return (b / c - 1) * c;
    }();
    
    int64_t sum = 0;
    if (from <= to)
    {
     const int n = (to - from) / c + 1;
     sum = n * (to + from) / 2;
    }
    std::cout << sum << '\n';
    
    int a, b, c;
    cin >> a >> b >> c;
    long long sum = 0;
    
    std::vector<int> all_prime_factors = // Get all prime factors of c
    std::unordered_set<int> factorSet;
    for (int primefactor : all_prime_factors)
    {
        int factor = primefactor;
        while (factor <= b)
        {
            if (factor % c == 0)
                factorSet.insert(factor);
            factor += primefactor;
        }
    }
    
    for (int x : factorSet)
    {
        sum += x;
    }
    
    cout << sum << endl;