P1249 最大乘積

2022-09-19 17:33:16 字數 1231 閱讀 4931

// 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 第一行是分解方案,相鄰的數之...