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).

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