JZOJ__Day 7:【普及模拟】max

题目描述

一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。
现在你的任务是将指定的正整数n分解成m个(m>=1)互不相同的自然数的和,且使这些自然数的乘积最大。

输入

只一个正整数n,(3≤n≤10000)。

输出

第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
第二行是最大的乘积。

样例输入

10

样例输出

2 3 5
30

数据范围限制

30%的数据 3<=n<=100

程序

#include<cstdio> 
#include<iostream>
using namespace std;
int n,m,l,w,k[10001],a[10000],maxn=10000;
void gaojin(int x)
{
    int g=0,k=0;
    for (int i=maxn;i>=1;i--)
    {
        g=a[i]*x+k;
        a[i]=g%10;
        k=g/10;
    }
}
int main()
{
    freopen("max.in","r",stdin);
    freopen("max.out","w",stdout);
    cin>>n;
    m=n;
    l=2;    
    if (n==4) 
    {
        cout<<n<<endl;
        cout<<n;
        return 0;
    }
    while (m>=l)
    {
        w++;
        k[w]=l;
        m-=l;
        l++;
    }
    if (m<=w) for (int i=m;i>=1;i--) k[w-i+1]++;
    else
    {
        for (int i=w;i>=1;i--) k[w-i+1]++;
        for (int i=m-w;i>=1;i--) k[w-i+1]++;
    }
    a[maxn]=1;
    for (int i=1;i<=w;i++) 
    {
        cout<<k[i]<<' ';
        gaojin(k[i]);
    }
    cout<<endl;
    l=1;
    while (a[l]==0) l++;
    for (int i=l;i<=maxn;i++) 
    cout<<a[i];
    fclose(stdin);
    fclose(stdout);
    return 0;
}
原文地址:https://www.cnblogs.com/YYC-0304/p/9500085.html