描述
俊博士正陶醉於自己的雲爆彈時,傳來乙個震驚的訊息。 這種炸彈被乙個小朋友破解了。 俊博士決定對雲爆彈進行公升級:將數字\(n\)分解成若干個不相等的小的正整數,要求它們的乘積越大化。
輸入一行,乙個正整數\(n\) ,\(2\le n\le 1000\)
輸出一行若干個數字
輸出拆分後的結果,每個數字中間有乙個空格。
針對這個問題,因為這些若干個自然數是不相同的,所以只能是從\(2\)開始分解,如 \(2,3,4...\) 這種順序
怎麼分解乘積最大?不妨設兩個數為\(a\), \(b\), 那麼,設 \(a = k + z\), \(b = k - z\)
那麼\(a * b = (k + z)(k-z) = k ^ 2 - z ^ 2\)
顯然, 當 \(z\) 越小時, 兩數乘積最大。
在這裡,我們把這個分解問題具體化:
\(9=2+3+4\),剛好可以分解這三個連續的數。
\(10=2+3+4+1\),因為\(1\)不會增大乘積,反而會佔據和,所以應該將其加到前面三個數上,為了保證最大而且互不相同,加到\(4\)上,則分解為
\(10=2+3+5\)。
\(11=2+3+4+2\),如果把\(2\)直接加到\(4\)上,乘積是\(2*3*6=36\),如果分別加到連續的數上,如\(3,4\),保證這些數之間的差距是最小的,那麼乘積是\(2*4*5=40\)。
\(12=2+3+4+3\),則這個三分成三個一,加到前面三個數上,保證了連續性。
\(13=2+3+4+4\),因為是四個一,所以我們採取的方法是最後乙個數加2,其他加1,那麼乘積是:\(3*4*6=72\)。
因此總體的策略就是先分解成連續的自然數,將剩餘的數按照從後往前的次序一次均勻分配。
現在我們要解決如何將這個數按照我們的策略來分。
首先從\(2\)開始往後分解,當發現剩下的數不夠分解乙個新的數字時停止。
然後將分的剩下的數每次從分的大數到小數均勻分配\(1\),就可以了。
需要注意一點,如果這個數分下的數比分的個數還多,那就要再次進行均勻分配。
比如\(8\),先分為\(2+3\),第一次均勻分配後為\(3+4\),但還有乙個\(1\),於是我們把\(1\)分到\(4\),即把\(8\)分為\(3+5\)。
#includeusing namespace std;
int a[1001];
int main()
} for(int i=1;i<=tot;i++)
printf("%d ",a[i]);
return 0;
}
yii2實現彈框
1.首先引入命名空間 use yii bootstrap modal useyii helpers url echo html a 來乙個彈框 id create data toggle modal data target create modal 關聯下面model的id屬性 class btn ...
原生彈框2 vue
詳情彈框 src assets images u291.svg altstyle width 16px height 16px cursor pointer id close click close 詳情內容 小結 彈框 樣式思路 btn 觸發彈窗的按鈕,其實就是來控制display none和bl...
模板 數學2
一元線性同餘方程組 x r i mod a i 將兩個方程整合成乙個,不斷整 比如x 8 7,x 11 9 整合成x 88 57 31 ll solve return r m m m 這句能保證回到正整數 中國剩餘定理 與上面條件不同,需要除數陣列m i 兩兩互質。ll a maxn m maxn ...