建設公司網(wǎng)站管理制度的意義百度網(wǎng)站推廣教程
藍橋杯-貨物擺放
- 1、題目描述
- 1.1 答案提交
- 1.2 運行限制
- 2、解決方案
- 2.1 方案一:暴力解法(三重循環(huán))
- 2.2 方案二:找出乘機的因子
1、題目描述
??小藍有一個超大的倉庫,可以擺放很多貨物。
??現(xiàn)在,小藍有 n 箱貨物要擺放在倉庫,每箱貨物都是規(guī)則的正方體。小藍規(guī)定了長、寬、高三個互相垂直的方向,每箱貨物的邊都必須嚴格平行于長、寬、高。
??小藍希望所有的貨物最終擺成一個大的長方體。即在長、寬、高的方向上分別堆 L、W、H 的貨物,滿足n=L×W×H。
??給定 n,請問有多少種堆放貨物的方案滿足要求。
??例如,當 n=4 時,有以下 66 種方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1、1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。
??請問,當 n=2021041820210418 (注意有 1616 位數(shù)字)時,總共有多少種方案?
??提示:建議使用計算機編程解決問題。
1.1 答案提交
??這是一道結(jié)果填空的題,你只需要算出結(jié)果后提交即可。本題的結(jié)果為一個整數(shù),在提交答案時只填寫這個整數(shù),填寫多余的內(nèi)容將無法得分。
1.2 運行限制
- 最大運行時間:1s
- 最大運行內(nèi)存: 256M
2、解決方案
2.1 方案一:暴力解法(三重循環(huán))
long num = 2021041820210418l;int count = 0;for ( long i = 1 ; i < num ; i++ ){for ( long j = 1 ; j < num ; j++ ){for ( long k = 1 ; k < num ; k++ ){if ( i * j *um ){count++;}}}}
?? 這個明顯超時了
2.2 方案二:找出乘機的因子
??我們先找出能夠被num整除的所有因子
,找到這些因子之后,由于是三個因子相乘的積等于num,由于因子的數(shù)量比num小太多了,此時對所有因子進行三重循環(huán)統(tǒng)計三個因子乘積=num的數(shù)量
即可。
package LanQiaoBei.貨物擺放;import java.util.HashSet;public class Main {//直接三重循環(huán)時間復雜度非常大,另辟蹊徑public static void main(String[] args) {long num = 2021041820210418L;//用HashSet存放num因子,自動解決因子重復問題HashSet<Long> common = new HashSet<>();//遍歷到num的平方根技術(shù),不需要都遍歷一遍for (long i = 1; i <= Math.sqrt(num); i++) {if (num % i == 0) {common.add(i);//可以整除就加入集合//i可以被整除,求出num的另外一個除數(shù)long n = num / i;if (n != i) { //不加判斷也行,因為我們用的hashset,但是系統(tǒng)判定超時common.add(n);}}}System.out.println("common.size():" + common.size());System.out.println(common);long count = 0;//這里不需要三重循環(huán),前兩個數(shù)確定后,第三個數(shù)也就確定了for (Long i : common) {for (Long j : common) {long k = num / (i * j);if (i * j * k == num) {count++;}}}System.out.println(count);}}
??運行結(jié)果如下圖: