原题题面
读入一个正整数 n n n( 10 ≤ n ≤ 31000 10≤n≤31000 10≤n≤31000)。要求将 n n n写成若干个正整数之和,并且使这些正整数的乘积最大。
例如, n = 13 n=13 n=13,则当n表示为 4 + 3 + 3 + 3 4+3+3+3 4+3+3+3(或 2 + 2 + 3 + 3 + 3 2+2+3+3+3 2+2+3+3+3)时,乘积= 108 108 108为最大。
输入格式
只有一个正整数 n n n( 10 ≤ n ≤ 31000 10≤n≤31000 10≤n≤31000)
输出格式
第1行输出一个整数,为最大乘积的位数。
第2行输出最大乘积的前100位,如果不足100位,则按实际位数输出最大乘积。
(提示:在给定的范围内,最大乘积的位数不超过5000位)。
输入样例
13
输出样例
3
108
题面分析
简单概括一下就是:已知
∑
x
i
=
N
\sum{x_i}=N
∑xi=N,求
m
a
x
{
∏
x
i
}
max\{\prod{x_i}\}
max{∏xi}.
看到
∑
x
i
\sum{x_i}
∑xi和
∏
x
i
\prod{x_i}
∏xi很容易 就能想到均值不等式。
假设
x
i
x_i
xi有
n
n
n项,我们有
(
∑
x
i
n
)
n
≥
∏
x
i
(\frac{\sum{x_i}}{n})^n\geq\prod{x_i}
(n∑xi)n≥∏xi
因为取到等号时,
x
i
x_i
xi两两相等,因此
x
i
x_i
xi要取的尽量平均,于是问题变成了求出
(
∑
x
i
n
)
n
=
(
N
n
)
n
(\frac{\sum{x_i}}{n})^n=(\frac{N}{n})^n
(n∑xi)n=(nN)n的最大值
我们可以用一些高数知识对它进行处理
记
y
=
(
N
n
)
n
y=(\frac{N}{n})^n
y=(nN)n,两边套
I
n
In
In,得到
I
n
y
=
n
I
n
N
−
n
I
n
n
Iny=nInN-nInn
Iny=nInN−nInn
两边再求导,得到
y
′
y
=
I
n
N
−
I
n
n
−
1
\frac{y'}{y}=InN-Inn-1
yy′=InN−Inn−1(这里不再赘述为什么左边不是
1
y
\frac{1}{y}
y1)
移项得到
y
′
=
(
I
n
N
−
I
n
n
−
1
)
∗
(
N
n
)
n
y'=(InN-Inn-1)*(\frac{N}{n})^n
y′=(InN−Inn−1)∗(nN)n
令
y
′
=
0
y'=0
y′=0,即
(
I
n
N
−
I
n
n
−
1
)
∗
(
N
n
)
n
=
0
(InN-Inn-1)*(\frac{N}{n})^n=0
(InN−Inn−1)∗(nN)n=0
因为
(
N
n
)
n
(\frac{N}{n})^n
(nN)n必定大于0,故原式等价于求
(
I
n
N
−
I
n
n
−
1
)
=
0
(InN-Inn-1)=0
(InN−Inn−1)=0,易知
n
=
N
e
n=\frac{N}{e}
n=eN
即把每个数尽可能地分成e。
且
y
y
y在
(
0
,
N
e
]
(0,\frac{N}{e}]
(0,eN]上单调递增,
[
N
e
,
∞
)
[\frac{N}{e},\infty)
[eN,∞)上单调递减。
但考虑到在整数范围,
N
e
\frac{N}{e}
eN取不到,因此候选项有
N
2
,
N
3
\frac{N}{2},\frac{N}{3}
2N,3N两个数,于是问题就转化为哪个优先取的问题。
代入方程,得到
2
N
2
<
3
N
3
2^{\frac{N}{2}}<3^{\frac{N}{3}}
22N<33N
如何证明?
两边取对数得到
N
2
I
n
2
和
N
3
I
n
3
\frac{N}{2}In2和\frac{N}{3}In3
2NIn2和3NIn3
注意到
I
n
2
2
<
I
n
3
3
\frac{In2}{2}<\frac{In3}{3}
2In2<3In3
故
2
N
2
<
3
N
3
2^{\frac{N}{2}}<3^{\frac{N}{3}}
22N<33N,
故优先取3,然后取2。 证毕。
于是这就变成了憨憨题,我们根据
n
m
o
d
3
n\ mod\ 3
n mod 3的不同结果来讨论取的方法。
n
m
o
d
3
=
0
n\ mod\ 3=0
n mod 3=0时,无脑拿3,答案就是
3
N
3
3^\frac{N}{3}
33N
n
m
o
d
3
=
1
n\ mod\ 3=1
n mod 3=1时,拿出一个3变两个2,答案就是
3
N
−
1
3
−
1
∗
2
2
3^{\frac{N-1}{3}-1}*2^2
33N−1−1∗22
n
m
o
d
3
=
2
n\ mod\ 3=2
n mod 3=2时,拿一个2之后全变3,答案就是
3
N
−
2
3
∗
2
3^{\frac{N-2}{3}}*2
33N−2∗2
AC代码(70ms)
import java.math.BigInteger;
import java.util.Scanner;
import static java.lang.Math.min;
/**
* @author DrGilbert
*/
public class Main
{
public static void main (String[] args)
{
Scanner cin = new Scanner (System.in);
int n;
while(cin.hasNext ())
{
n=cin.nextInt ();
BigInteger ans;
if(n%3==0)
{
ans=BigInteger.valueOf (3).pow ((n/3));
}
else if(n%3==1)
{
ans=BigInteger.valueOf (3).pow ((n/3-1)).multiply (BigInteger.valueOf (4));
}
else
{
ans=BigInteger.valueOf (3).pow ((n/3)).multiply (BigInteger.valueOf (2));
}
String ans1=ans.toString ();
System.out.println (ans1.length ());
for(int i=0;i<min(100,ans1.length ());i++)
{
System.out.print (ans1.charAt (i));
}
System.out.println ();
}
}
}
后记
用什么FFT,大数他不够香吗
DrGilbert 2020.10.4