题意:把正整数n化分成若干个正整数的和,并使这些正整数的乘积最大,求最大乘积(注意输出要求)
《奥精》上的题目...
结论:
如果n是3的倍数 那么将n划分成 n/3 个3是最优的
如果n是3的倍数+1 那么将n划分成 (n-4)/3 个3和2个2(1个4)是最优的
如果n是3的倍数+2 那么将n划分成 (n-2)/3 个3和1个2是最优的
po神给了证明 orz
考虑一般情况,划分成任意实数
设我们将n划分成了x个正实数之和
显然,当这x个数相等时答案是最优的即答案是(n/x)^x
设y=(n/x)^x
则有lny=x[ln(n)-ln(x)]
求导可得y'=(n/x)^x * ( ln(n) - ln(x) - 1 )
当x=n/e时y‘取0 此时乘积最大
因此每个数要尽量靠近e才能使答案最大
现在考虑整数 离e最近的整数是3 因此要把n尽量分成3 不足的用2补齐 这样可以保证是最优的
var
n,len :longint;
i :longint;
a :array[0..5010] of longint;
procedure mul(x:longint);
var
i:longint;
t:longint;
begin
for i:=1 to len do a[i]:=a[i]*x;
t:=0;
for i:=1 to len do
begin
a[i]:=a[i]+t;
t:=a[i] div 10;
a[i]:=a[i] mod 10;
end;
while (t<>0) do
begin
inc(len);
a[len]:=t mod 10;
t:=t div 10;
end;
end;
procedure work(x,t:longint);
var
i:longint;
begin
for i:=1 to x do mul(3);
mul(t);
end;
begin
read(n);
len:=1;a[1]:=1;
if (n mod 3=0) then work(n div 3,1) else
if ((n-2) mod 3=0) then work((n-2) div 3,2) else work((n-4) div 3,4);
writeln(len);
if (len<100) then
for i:=len downto 1 do write(a[i])
else for i:=len downto (len-99) do write(a[i]);
writeln;
end.
——by Eirlys