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).
这样处理大幅度提高了算法速度。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步