zoukankan      html  css  js  c++  java
  • Codeforces Round #102 (Div. 2)总结(如何处理A*B*C==n!!!)

    A题:手速题

    B题:分类讨论题

    C题:暴力+优化的数学题

    #include <iostream>
    #include <math.h>
    using namespace std;
    int main()
    {
        long long n;
        while(cin >> n){
            unsigned long long maxc=0,minc=1844674407370955161;
            for(long long i=1;i*i<=n;i++){
                if(n%i==0){
                    long long bc=n/i;
                    for(long long j=1;j*j<=bc;j++){
                        if(bc%j==0){
                            int k=bc/j;
                            if((i+1)*(j+2)*(k+2)>maxc) maxc=(i+1)*(j+2)*(k+2);
                            if((i+2)*(j+1)*(k+2)>maxc) maxc=(i+2)*(j+1)*(k+2);
                            if((i+2)*(j+2)*(k+1)>maxc) maxc=(i+2)*(j+2)*(k+1);
                            if((i+1)*(j+2)*(k+2)<minc) minc=(i+1)*(j+2)*(k+2);
                            if((i+2)*(j+1)*(k+2)<minc) minc=(i+2)*(j+1)*(k+2);
                            if((i+2)*(j+2)*(k+1)<minc) minc=(i+2)*(j+2)*(k+1);
                            //cout << i <<" "<<j<<" "<<k<<endl;
                        }
                    }
                }
            }
            cout << minc-n <<" "<<maxc-n <<endl;
        }
        return 0;
    }

    如何快速处理数学中立方变量,如枚举A*B*C==n(1<=n<=10^9)中的A,B,C?

    C题的模型:在满足A*B*C==n的条件下,使(A+1)*(B+2)*(C+2)-n最大或最小?

    因为满足A*B*C==n,

    所以枚举时A只需枚举到sqrt(n),b只需枚举到sqrt(n/A).

    这样处理大幅度提高了算法速度。

  • 相关阅读:
    Java第九次作业
    Java第八次作业
    Java第七次作业
    Java第六次作业
    Java第五次作业
    Java第四次作业
    Java第三次作业
    Java第二次作业
    Java第一次作业
    高级工程师和初级工程师之间的一道坎
  • 原文地址:https://www.cnblogs.com/markliu/p/2628656.html
Copyright © 2011-2022 走看看