P4157 [SCOI2006]整数划分

传送门:https://www.luogu.com.cn/problem/P4157

借鉴大佬:https://blog.csdn.net/oampamp1/article/details/108919448

题意

给一个整数N,将他拆成若干整数,求他们乘积最大值。

思路

ni=1xi=Nmaxni=1xi(nxi)ni=1xi=Nmaxni=1xi(nxi)

nni=11xinni=1xini=1xinnni=1x2in

ni=1xinnni=1xi

(ni=1xin)nni=1xi

使xi

(Nn)n=ni=1xi

y=(Nn)n

lny=nlnNnlnn

n

yy=lnNlnn1

y=(lnNlnn1)(Nn)n

y=0(Nn)n>0lnNlnn1=0

n=elnN1=Ne

nnN2N3

ni=1xi=(Nn)n=2N23N3

2N2<3N3,

ni=1xi=3N3332

Nmod3:

Nmod3=03ans=3N3 Nmod3=13143ans=3N1314 Nmod3=223ans=3N232

由于答案爆longlong,所以用JAVA大数,这不比高精度香吗?

Code(67MS)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

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();
}
}

本文作者:jujimeizuo
本文地址https://blog.jujimeizuo.cn/2020/10/08/luogu-p4157/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!