GESP认证C++编程真题解析 | 202603 七级
编程题
P15802 拆分
【题目来源】
洛谷:[P15802 GESP202603 七级] 拆分 - 洛谷
【题目描述】
小 A 想将正整数 \(n\) 拆分成若干个正整数之和,并最大化拆分后的正整数之积。小 A 希望你帮他计算出拆分后正整数之积的最大值。由于答案可能很大,你只需要求出答案对 \(10^9\) 取模的结果。
形式化地,\(n\) 的拆分是满足 \(a_1+\cdots+a_k=n\) 的若干个正整数 \(a_1,\dots,a_k\),其中 \(1\leq k\leq n\)。你需要求出 \(n\) 的所有拆分中 \(a_1\times \cdots\times a_k\) 的最大值对 \(10^9\) 取模的结果。
【输入】
第一行,一个正整数 \(t\),表示数据组数。
对于每组数据:一行,一个整数 \(n\),表示给定的正整数。
【输出】
对于每组数据:输出一行,一个整数,表示 \(n\) 拆分后正整数之积的最大值对 \(10^9\) 取模的结果。
【输入样例】
3
5
8
100
【输出样例】
6
18
755407364
【解题思路】

【算法标签】
《洛谷 P15802 拆分》 #动态规划DP# #数学# #贪心# #分类讨论# #GESP# #2026#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 4000005, mod = 1e9;
int t, n, ans[6] = {0, 1, 2, 3, 4, 6}; // 小规模n的答案
// 快速幂取模
int qmi(int a, int b)
{
int mul = 1;
while (b)
{
if (b & 1)
{
mul = mul * a % mod;
}
a = a * a % mod;
b >>= 1;
}
return mul;
}
signed main()
{
cin >> t;
while (t--)
{
cin >> n;
if (n < 6) // n较小,直接查表
{
cout << ans[n] << endl;
}
else if (n % 3 == 0) // n是3的倍数
{
cout << qmi(3, n / 3) << endl; // 全部分成3
}
else if (n % 3 == 1) // 余数为1
{
// 将最后一个4分成3+1不如分成2+2,所以是3^(k-1)*4
cout << (qmi(3, n / 3 - 1) * 4) % mod << endl;
}
else // 余数为2
{
// 分成若干个3和一个2
cout << (qmi(3, n / 3) * 2) % mod << endl;
}
}
return 0;
}
【运行结果】
3
5
6
8
18
100
755407364
浙公网安备 33010602011771号