【HDU6298】2018杭電多校訓練賽第一場第一題Maximum Multiple 解題報告
阿新 • • 發佈:2018-12-24
題目連結:
題意:
給定一個數n,找出三個正整數x、y和z,滿足:n=x+y+z,x|n,y|n,z|n。然後求xyz的最大值。
輸入:
第一行輸入T,表示多少個測試用例。下面T行,每行輸入一個數n。
輸出:
對於每一個測試用例,輸出一個數,表示xyz的最大值;若不存在這個數,則輸出-1。
分析:
先理解題目中一個數學式子意思:x|n,這個可以參考我的另一篇文章:整除的數學表達
然後知道,n能整除x、y和z,即
然後我們令:,又因為:,所以我們有:(其中,r,s,t為整數)
那麼我們可以按照這個上面式子得出:
所以其實r,s,t的解為:3,3,3和2,4,4和2,3,6
又:,所以對應的x,y和z的三組解:、和
所以:
- 對於第一組解:要求n能被3整除,而xyz的最大值為
- 對於第二組解:要求n能被4整除,而xyz的最大值為
- 對於第三組解:要求n能被6整除,因為第一組是被3整除,所以被6整除一定能被3整除,而且此時的xyz的最大值為,明顯比第一組解的要小,所以第三種情況不用考慮
- 最後如果沒有前幾種情況,所以就沒有滿足題目的要求,也就沒有能表示xyz的最大值的數存在,所以輸出-1可以。
AC程式碼:
#include <cstdio> int main() { int T; scanf("%d", &T); // 因為n是1e6,所以三次方就是1e18,要用long long型 for (int cas = 1; cas <= T; ++cas) { long long n; scanf("%lld", &n); if (n % 3 == 0) printf("%lld\n", n * n * n / 27); else if (n % 4 == 0) printf("%lld\n", n * n * n / 32); else puts("-1"); } return 0; }