P4157 [SCOI2006]整数划分 数学推导 + 大数
传送门:https://www.luogu.com.cn/problem/P4157
借鉴大佬:https://blog.csdn.net/oampamp1/article/details/108919448
题意
给一个整数N,将他拆成若干整数,求他们乘积最大值。
思路
先 将 题 目 转 化 一 下 : 先将题目转化一下: 先将题目转化一下:
已 知 ∑ i = 1 n x i = N , 求 m a x { ∏ i = 1 n x i } ( n 表 示 x i 有 几 项 ) 已知\sum_{i=1}^n x_i=N,求max\{\prod_{i=1}^n x_i\}\;\;\;\;(n表示x_i有几项) 已知i=1∑nxi=N,求max{i=1∏nxi}(n表示xi有几项)
首
先
根
据
均
值
不
等
式
(
调
和
≤
几
何
≤
算
术
≤
平
方
)
:
首先根据均值不等式(调和\leq 几何\leq 算术 \leq 平方):
首先根据均值不等式(调和≤几何≤算术≤平方):
n
∑
i
=
1
n
1
x
i
≤
∏
i
=
1
n
x
i
n
≤
∑
i
=
1
n
x
i
n
≤
∑
i
=
1
n
x
i
2
n
n
\frac{n}{\sum_{i=1}^n\frac{1}{x_i}}\leq \sqrt[n]{\prod_{i=1}^nx_i}\leq \frac{\sum_{i=1}^nx_i}{n}\leq \sqrt[n]\frac{\sum_{i=1}^nx_i^2}{n}
∑i=1nxi1n≤ni=1∏nxi≤n∑i=1nxi≤nn∑i=1nxi2
所
以
可
以
得
到
:
所以可以得到:
所以可以得到:
∑
i
=
1
n
x
i
n
≥
∏
i
=
1
n
x
i
n
\frac{\sum_{i=1}^nx_i}{n}\ge \sqrt[n]{\prod_{i=1}^nx_i}
n∑i=1nxi≥ni=1∏nxi
( ∑ i = 1 n x i n ) n ≥ ∏ i = 1 n x i \left( \frac{\sum_{i=1}^nx_i}{n} \right)^n\ge \prod_{i=1}^nx_i (n∑i=1nxi)n≥i=1∏nxi
观 察 上 式 , 要 使 乘 积 最 大 , 那 需 要 尽 量 取 等 号 , 所 以 x i 要 尽 量 平 均 , 所 以 得 到 下 式 : 观察上式,要使乘积最大,那需要尽量取等号,所以x_i要尽量平均,所以得到下式: 观察上式,要使乘积最大,那需要尽量取等号,所以xi要尽量平均,所以得到下式:
( N n ) n = ∏ i = 1 n x i \left( \frac{N}{n} \right)^n= \prod_{i=1}^nx_i (nN)n=i=1∏nxi
令 y = ( N n ) n , 两 边 同 时 取 对 数 得 : 令y=(\frac{N}{n})^n,两边同时取对数得: 令y=(nN)n,两边同时取对数得:
ln y = n ln N − n ln n \ln y=n\ln N-n\ln n lny=nlnN−nlnn
两 边 同 时 对 n 求 导 得 : 两边同时对n求导得: 两边同时对n求导得:
y ′ y = ln N − l n n − 1 \frac{y'}{y}=\ln N-ln n - 1 yy′=lnN−lnn−1
得 y ′ = ( ln N − ln n − 1 ) ( N n ) n 得y'=(\ln N-\ln n - 1)(\frac{N}{n})^n 得y′=(lnN−lnn−1)(nN)n
令 y ′ = 0 , 因 为 ( N n ) n > 0 , 所 以 ln N − ln n − 1 = 0 , 即 : 令y'=0,因为(\frac{N}{n})^n>0,所以\ln N-\ln n - 1=0,即: 令y′=0,因为(nN)n>0,所以lnN−lnn−1=0,即:
n = e ln N − 1 = N e n=e^{\ln N - 1}=\frac{N}{e} n=elnN−1=eN
由 于 n 是 在 整 数 域 里 , 所 以 n 只 有 两 个 选 择 N 2 和 N 3 , 那 么 该 取 哪 一 个 呢 ? 由于n是在整数域里,所以n只有两个选择\frac{N}{2}和\frac{N}{3},那么该取哪一个呢? 由于n是在整数域里,所以n只有两个选择2N和3N,那么该取哪一个呢?
刚 开 始 的 ∏ i = 1 n x i = ( N n ) n = 2 N 2 或 3 N 3 , 现 在 就 看 哪 个 大 。 刚开始的\prod_{i=1}^nx_i=(\frac{N}{n})^n=2^{\frac{N}{2}}或3^{\frac{N}{3}},现在就看哪个大。 刚开始的∏i=1nxi=(nN)n=22N或33N,现在就看哪个大。
根 据 上 图 可 知 , 2 N 2 < 3 N 3 , 当 然 也 可 以 手 动 算 一 下 。 根据上图可知,2^{\frac{N}{2}}<3^{\frac{N}{3}},当然也可以手动算一下。 根据上图可知,22N<33N,当然也可以手动算一下。
所 以 得 ∏ i = 1 n x i = 3 N 3 最 大 , 即 优 先 取 3 , 没 有 3 取 2 , 总 之 , 推 导 到 最 后 就 是 个 憨 憨 题 。 总 结 一 下 : 所以得\prod_{i=1}^nx_i=3^{\frac{N}{3}}最大,即优先取3,没有3取2,总之,推导到最后就是个憨憨题。总结一下: 所以得∏i=1nxi=33N最大,即优先取3,没有3取2,总之,推导到最后就是个憨憨题。总结一下:
让 N m o d 3 : 让N mod \;3: 让Nmod3:
−
N
m
o
d
3
=
0
,
全
部
拆
成
3
,
a
n
s
=
3
N
3
- N mod\; 3=0,全部拆成3,ans=3^{\frac{N}{3}}
−Nmod3=0,全部拆成3,ans=33N
−
N
m
o
d
3
=
1
,
拿
出
一
个
3
然
后
加
1
组
成
4
,
其
他
都
为
3
,
a
n
s
=
3
N
−
1
3
−
1
∗
4
- Nmod\;3=1,拿出一个3然后加1组成4,其他都为3,ans=3^{\frac{N-1}{3}-1}*4
−Nmod3=1,拿出一个3然后加1组成4,其他都为3,ans=33N−1−1∗4
−
N
m
o
d
3
=
2
,
拿
出
一
2
,
其
他
都
为
3
,
a
n
s
=
3
N
−
2
3
∗
2
-Nmod\;3=2,拿出一2,其他都为3,ans=3^{\frac{N-2}{3}}*2
−Nmod3=2,拿出一2,其他都为3,ans=33N−2∗2
由 于 答 案 爆 l o n g l o n g , 所 以 用 J A V A 大 数 , 这 不 比 高 精 度 香 吗 ? 由于答案爆longlong,所以用JAVA大数,这不比高精度香吗? 由于答案爆longlong,所以用JAVA大数,这不比高精度香吗?
Code(67MS)
import java.util.*;
import java.math.*;
import static java.lang.Math.min;
public class Main
{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N;
N = in.nextInt();
BigInteger ans = new BigInteger("1");
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 if(N % 3 == 2) {
ans = BigInteger.valueOf(3).pow((N / 3)).multiply(BigInteger.valueOf(2));
}
String s = ans.toString();
System.out.println(s.length());
for(int i = 0;i < min(100, s.length()); i++) {
System.out.print(s.charAt(i));
}
System.out.println();
}
}