Description
一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,。。。。
现在你的任务是将指定的正整数n分解成互不相同的自然数和,且使这些自然数的乘积最大。
Input
只一个正整数n,(3<=n<=10 000)。
Output
第一行是分解的方案,相邻两数用一个空格分开,并且按从小到大的顺序。
第二行是最大的乘积。
Sample Input
10
Sample Output
2 3 5
30
思路: 由于需要将一个正整数n拆分成 几个互不相同的自然数,因此我们可以想到等差数列,假设前m项等差数列和为sum,sum<=n;第m+1项为x;x+sum>n。
那么,x怎么办呢?
假设,我有两个常数a,b。对于x如何分,才能使得乘积最大。可以列这样的一个式子:(a+x1)*(b+x2)。(x1+x2=x)那么只有当x1==x2的时候乘积最大。
因此,我们可以将x均分给m项的等差数列,此时得到的乘积最大。
#include<bits/stdc++.h>
using namespace std;
int a[1100];
string mul(string a,int b)
{
string c;
char s;
int len=a.length(),ok=0;
for(int i=len-1; i>=0; i--)
{
int temp=(a[i]-'0')*b+ok;
ok=temp/10;
s=temp%10+'0';
c=s+c;
}
while(ok)
{
s=ok%10+'0';
c=s+c;
ok/=10;
}
return c;
}
int main()
{
int n,sum=0,cnt=0;
scanf("%d",&n);
if(n == 3||n == 4){
cout<<1<<" "<<n-1<<endl;
cout<<n-1<<endl;
return 0;
}
for(int i=2;sum+i<=n;i++){
a[i-2]=i;
sum+=i;cnt++;
}
int x=n-sum,y=x/cnt,z=x%cnt;
for(int i=cnt-1;i>=0;i--){
if(i>=cnt-z) a[i]+=y+1;
else a[i]+=y;
}
for(int i=0;i<cnt;i++){
printf("%d%c",a[i],i==cnt-1?'\n':' ');
}
string s1;
s1+='1';
for(int i=0;i<cnt;i++){
s1=mul(s1,a[i]);
}
cout<<s1<<endl;
return 0;
}