【藍橋杯學習記錄】貨物擺放
一、題目
小藍有一個超大的倉庫,可以擺放很多貨物。
現(xiàn)在,小藍有?nn?箱貨物要擺放在倉庫,每箱貨物都是規(guī)則的正方體。小藍規(guī)定了長、寬、高三個互相垂直的方向,每箱貨物的邊都必須嚴格平行于長、寬、高。
小藍希望所有的貨物最終擺成一個大的長方體。即在長、寬、高的方向上分別堆?L、W、H 的貨物,滿足?n = L × W × H。
請問,當?n = 2021041820210418時,(注意有?16?位數(shù)字)時,總共有多少種方案?
二、解題思路
本題思路很簡單,可以用三重循環(huán)(循環(huán)變量依次為i,j,k),在第三重循環(huán)檢測是否等于n,但是因為數(shù)太大,所以需要優(yōu)化,否則的話會運行很長時間(看藍橋杯解析講最基本的暴力算法要運行一年才能得出結(jié)果,可怕)。
首先在三重循環(huán)中,可以在第二重循環(huán)中先判斷i*j是否大于n,這樣可以少運行一點時間。但是這樣還不夠。
我們發(fā)現(xiàn)對于能夠符合i*j*k的數(shù),一定是n的因數(shù)所以我們可以先算出這些因數(shù)并存儲在一個數(shù)組a中,這樣只需要一個循環(huán),并且這個循環(huán)也可以優(yōu)化,我們會發(fā)現(xiàn)對與n的因數(shù)x,n/x也是n的因數(shù),所以在循環(huán)中可以先判斷x是否是他的因數(shù),然后n/x也是他的因數(shù)。當然還有種特殊情況就是x*x=n時,只需要將一個x加入數(shù)組就行,所以還需要判斷一下x是否等于n/x。此時可以看出來,我們不需要再循環(huán)sqrt(n) ()之后的數(shù)了,因為在前面的循環(huán)中我們已經(jīng)計數(shù)過了。
最后只需要在數(shù)組a中進行三重循環(huán),判斷a[i]*a[j]*a[k]是否等于n就可以了,這樣時間大大縮短了。
三、完整代碼
