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

【解题思路】

image

【算法标签】

《洛谷 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
posted @ 2026-03-23 16:51  团爸讲算法  阅读(9)  评论(0)    收藏  举报