|
|
package class_2023_05_4_week;
|
|
|
|
|
|
// 来自华为
|
|
|
// 一个数字n,一定要分成k份
|
|
|
// 得到的乘积尽量大是多少
|
|
|
// 数字n和k,可能非常大,到达10^12规模
|
|
|
// 结果可能更大,所以返回结果对1000000007取模
|
|
|
public class Code02_SplitNtoKMaxProduct {
|
|
|
|
|
|
// 暴力递归
|
|
|
// 一定能得到最优解
|
|
|
public static int maxValue1(int n, int k) {
|
|
|
if (k == 0 || n < k) {
|
|
|
return -1;
|
|
|
}
|
|
|
return process1(n, k);
|
|
|
}
|
|
|
|
|
|
// 剩余的数字rest,一定要拆成j份,返回最大乘积
|
|
|
public static int process1(int rest, int j) {
|
|
|
if (j == 1) {
|
|
|
return rest;
|
|
|
}
|
|
|
// 10 , 3份
|
|
|
// 1 * f(9,2)
|
|
|
// 2 * f(8,2)
|
|
|
// 3 * f(7,2)
|
|
|
// ...
|
|
|
int ans = Integer.MIN_VALUE;
|
|
|
for (int cur = 1; cur <= rest && (rest - cur) >= (j - 1); cur++) {
|
|
|
int curAns = cur * process1(rest - cur, j - 1);
|
|
|
ans = Math.max(ans, curAns);
|
|
|
}
|
|
|
return ans;
|
|
|
}
|
|
|
|
|
|
// 贪心的解
|
|
|
// 这不是最优解,只是展示贪心思路
|
|
|
public static int maxValue2(int n, int k) {
|
|
|
if (k == 0 || n < k) {
|
|
|
return -1;
|
|
|
}
|
|
|
// 数字n,一定要分k份
|
|
|
// 每份先得多少,n/k
|
|
|
int a = n / k;
|
|
|
// 有多少份可以升级成a+1
|
|
|
int b = n % k;
|
|
|
int ans = 1;
|
|
|
for (int i = 0; i < b; i++) {
|
|
|
ans *= a + 1;
|
|
|
}
|
|
|
for (int i = 0; i < k - b; i++) {
|
|
|
ans *= a;
|
|
|
}
|
|
|
return ans;
|
|
|
}
|
|
|
|
|
|
// 贪心的解
|
|
|
// 这是最优解
|
|
|
// 但是如果结果很大,让求余数...
|
|
|
public static int maxValue3(long n, long k) {
|
|
|
if (k == 0 || n < k) {
|
|
|
return -1;
|
|
|
}
|
|
|
int mod = 1000000007;
|
|
|
long a = n / k;
|
|
|
long b = n % k;
|
|
|
long part1 = power(a + 1, b, mod);
|
|
|
long part2 = power(a, k - b, mod);
|
|
|
return (int) (part1 * part2) % mod;
|
|
|
}
|
|
|
|
|
|
// 返回a的n次方,%mod的结果
|
|
|
public static long power(long a, long n, int mod) {
|
|
|
long ans = 1;
|
|
|
long tmp = a;
|
|
|
while (n != 0) {
|
|
|
if ((n & 1) != 0) {
|
|
|
ans = (ans * tmp) % mod;
|
|
|
}
|
|
|
n >>= 1;
|
|
|
tmp = (tmp * tmp) % mod;
|
|
|
}
|
|
|
return ans;
|
|
|
}
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
// 可以自己来用参数实验
|
|
|
int n = 20;
|
|
|
int k = 4;
|
|
|
System.out.println(maxValue1(n, k));
|
|
|
System.out.println(maxValue2(n, k));
|
|
|
// System.out.println(maxValue3(n, k));
|
|
|
}
|
|
|
|
|
|
}
|