hdu 6298 Maximum Multiple(规律)
hdu6298 Maximum Multiple
题意:
给你一个整数n,从中找出可以被n整除的三个数x,y,z;
要求x+y+z=n,且x*y*z最大。
思路:
开始一看T到1e6,n也到1e6,就想到打表,可是打表就只输出最大值
没有把取的那三个数也数出来,纠结了许久。
正解就是设a=n/x,b=n/y,c=n/z;
则1/a+1/b+1/c=1;
则abc可取3,3,3;2,3,6;2,4,4
代码:
#include<bits/stdc++.h> using namespace std; #define N 100 typedef long long ll; /*int main() { int m; while(cin>>m) { for(int n=1;n<=m;n++){ long long ans=-1; int a=0,b=0,c=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(n%i==0&&n%j==0&&n%k==0&&i+j+k==n) { long long tmp=i*j*k; if(ans<tmp) { ans=tmp; a=i; b=j; c=k; } } } } } if(ans!=-1){ cout<<n<<" "<<ans<<" "; cout<<a<<" "<<b<<" "<<c<<endl; } } } return 0; }*/ int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T; ll n; cin>>T; while(T--){ cin>>n; ll ans=-1; ll x,y,z; if(n%2==0) { x=n/2,y=n/3,z=n/6; if(x+y+z==n&&x*y*z>ans) ans=x*y*z; x=n/2,y=n/4,z=n/4; if(x+y+z==n&&x*y*z>ans) ans=x*y*z; } if(n%3==0){ x=n/3,y=n/3,z=n/3; if(x+y+z==n&&x*y*z>ans) ans=x*y*z; } cout<<ans<<endl; } }