尽可能把n分成多份
以2004为例
尝试:2+3+4+......+n=2004
若2+3+4+......+n比2004大1:因数最少减少一个,为使乘积最大,应该去掉最小的2,为最大的数加上1.
若比2004大k(k>1)则去掉等于k的数即可使乘积最大
如15:2+3+4+5=14,2+3+4+5+6=20,则去掉(20-15=5)2+3+4+6=15时乘积最大
但是需要特判3和4,二者皆有因数1,其余的数皆不需要1.
需要用高精度乘法来解决第二个问题
#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<cctype>
#define IOS std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
#define pi acos(-1);
#include<map>
using namespace std;
typedef long long ll;
typedef struct node{
}node;
vector<int>mul(vector<int>A,int b){
vector<int>C;
int t=0;
for(int i=A.size()-1;i>=0;i--){
t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(t){
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0)C.pop_back();
reverse(C.begin(),C.end());
return C;
}
int s[5000];
int main(){
IOS;
int n;cin>>n;
if(n<=4){
cout<<1<<" "<<n-1<<endl;
cout<<n-1;
}
else{
int res=0,index=0;
vector<int>A;
A.push_back(1);
for(int i=2;res<n;i++){
res+=i;
s[index++]=i;
}
if(res>n)index--;
for(int i=0;i<=index;i++){
if(s[i]==res-n)continue;
A=mul(A,s[i]);
cout<<s[i]<<" ";
}
cout<<endl;
for(int i=0;i<A.size();i++)cout<<A[i];
}
return 0;
}