2018 Multi-University Training Contest 1 : Maximum Multiple

因为 x|n ,y|n ,z|n 我们假设存在 n%a=n%b=n%c=0
使得x=n/a , y=n/b , z=n/c 并且n/a + n/b + n/c = n

因为x,y,z的取值是无序的,所以我们可以设a<=b<=c,即x>=y>=z
我们枚举 a 的所有取值情况:

a=2 (a最小为2),所以 n/b+n/c=n/2 ,得到 2*b+2*c=b*c ,这里的解只有两个 (3,6)和(4,4)
a=3 (a最大为3),因为 a<=b<=c , 这里只有 b=c=3 ,不然 n/a + n/b + n/c!=n

所以有三种情况:

a=2,b=3,c=6
a=2,b=4,c=4
a=3,b=3,c=3

但是我们还要x*y*z最大,即n*n*n/(a*b*c)最大,所以我们要把 a=2,b=3,c=6 这种情况变成a=3,b=3,c=3 ,因为 n%2=n%3=n%6=0 ,所以 n/2=n/3+n/6 ,所以 x-n/6,y,z+n/6,即 a=3,b=3,c=3,这样的x*y*z才最大,因为3*3*3<2*3*6

所以我们就只有两种情况了:

a=2,b=4,c=4
a=3,b=3,c=3

所以这里只有3和4的倍数满足情况

我的代码:

#include<cstdio>
using namespace std;

int main(){

    int T;
    scanf("%d",&T);
    while(T--){

        int n;
        scanf("%d",&n);
        if(n%3==0){

            printf("%lld\n",(long long)n*n*n/27);
        }
        else if(n%4==0){

            printf("%lld\n",(long long )n*n*n/32);
        }
        else printf("-1\n");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/81178887