P4157 [SCOI2006]整数划分 (数学推导+大数)

    科技2022-07-15  111

    原题题面

    读入一个正整数 n n n 10 ≤ n ≤ 31000 10≤n≤31000 10n31000)。要求将 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 10n31000

    输出格式

    第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} (nxi)nxi 因为取到等号时, 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 (nxi)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=nInNnInn 两边再求导,得到 y ′ y = I n N − I n n − 1 \frac{y'}{y}=InN-Inn-1 yy=InNInn1(这里不再赘述为什么左边不是 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=(InNInn1)(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 (InNInn1)(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 (InNInn1)=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 2NIn23NIn3 注意到 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 33N1122 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 33N22

    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

    Processed: 0.015, SQL: 8