要使加数乘积最大,那么所有的加数要尽可能接近。所以设n的加数如下:
2+3+…+m+k;m为最大加数,k为剩余的数(k<=m);然后把k分到其他数中,策略就是从m->2的数值一次加一,直至把k消耗完。
要使加数乘积最大,那么所有的加数要尽可能接近。所以设n的加数如下:
2+3+…+m+k;m为最大加数,k为剩余的数(k<=m);然后把k分到其他数中,策略就是从m->2的数值一次加一,直至把k消耗完。
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
int main()
{
int n;
cin>>n;
int sh,x,sum=0;
for(x=2;;x++){
if(sum+x>n)break;
sum+=x;
}
x--;//出去剩余的数的最大加数
sh=n-sum;//剩余的数
ll ans=1;
if(sh==x){//如果剩余的数等于最大加数
ans*=(x+2);//最大加数加2,因为平分一轮后还剩一个
sh-=2;
x--;
}
//把剩余的平分完
while(sh){
sh--;
ans*=(x+1);
x--;
}
//处理没有平分到的
while(x>=2){
ans*=x;
x--;
}
cout<<ans<<endl;
getchar();
getchar();
return 0;
}