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).
这样处理大幅度提高了算法速度。