// problem: p1249 最大乘積
// contest: luogu
// url:
// memory limit: 125 mb
// time limit: 1000 ms
// user: pannnn
#include using namespace std;
/* 把n分拆成若干個互不相等的自然數的和的分法只有有限種,因而一定存在一種分法,使得這些自然數的乘積最大。
因1作因數,則顯然乘積不會最大。把n分拆成若干個互不相等的自然數的和,因數個數越多,乘積越大。
為了使因數個數盡可能多,把n分成2+3+...+k直到滿足2+3+...+k <= n且2+3+...+k+(k+1)大於n,
令s = 2+3+...+k,一共k-1個數
若s < n,則還需要分配n - s。
如果能把數分到更小的數上,那麼乘積更大,但不允許數重複,需要從大數開始向前,依次分配1
如 s = 2 + 3 + 4 + 5 + 6 + 7
例如 n - s等於1
分配後:2 + 3 + 4 + 5 + 6 + 8
例如n - s等於3
分配後:2 + 3 + 4 + 6 + 7 + 8
即從某個位置開始,全部加1
可視為從2 + 3 + ... + k + (k + 1)使得s > n後刪去某個數
特殊情況,若和比n大1,則因數個數至少減少乙個,為了使乘積最大,去掉最小的2,並將最後乙個數加上1
否則,去掉等於s-n的那個數
此時乘法最大(去掉可以使其值變為1,不影響結果)
*/vectormul(vectora, int b)
while (pre)
return res;
}int main()
if (sum - n == 1) else
vectormulres(1, 1);
for (int i = 0; i < resque.size(); ++i)
cout << resque[i] << " ";
mulres = mul(mulres, resque[i]);
}cout << endl;
for (int i = mulres.size() - 1; i >= 0; --i)
cout << endl;
return 0;
}
P1249 最大乘積 洛谷
題目 p1249 最大乘積 分析 一道高精 貪心 乙個數拆的越多乘積會越大,但不要拆出1,這樣浪費了 所以就2,3,4,5,但也不能連續的一直拆,因為可能不夠拆了 所以就可以跳出那個數 把那個數拆給前面的 大概就這樣 上 include using namespace std const int n...
P1249 最大乘積 (數論 貪心)
題目鏈結 題面 題解 從2開始連續幾個自然數的乘積最大。假設我們 2 3 4 k n 剛好成立。我們設ans 2 3 4 k 如果ans n,我們直接輸出乘積即可。如果ans n 1,那我們去掉2,令k 1 如果ans n 1 假設 ans n p,那麼我們去掉p即可。因為需要大數,就用python...
luogu p1249 最大乘積
傳送門 乙個正整數一般可以分為幾個互不相同的自然數的和,如 3 1 2 4 1 3 5 1 4 2 3 6 1 5 2 4 現在你的任務是將指定的正整數 n 分解成若干個互不相同的自然數的和,且使這些自然數的乘積最大。只乙個正整數 n 3 leq n leq 10000 第一行是分解方案,相鄰的數之...