bzoj 1263 高精度b

题意:把正整数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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值