------------
## 题目大概:
有 $T$ 组数据,每组数据给出一个整数
$N(5 \le N \le 1000)$,要求你将这个整数 $N$ 分解为若干整数和的形式,使这些整数的乘积最大,输出分解后的这些整数。
##### [返回题目](https://www.luogu.com.cn/problem/solution/UVA668)
------------
这道题比较偏数学了,所以想通如何得出正确答案,就可以比较轻松的 AC 了。
先说说解题思路吧:
1. 首先我们要知道,每个大于 $4$ 的数拆分为多个正整数之和,再将这些拆分出的数相乘后,他们的积一定大于原数。
2. 其次,将一个正整数拆分为多个正整数后,拆分出的每个数都比原数小。
3. 所以,我们可以得出结论:拆分数时,应该拆分的越小越好。
4. 但是,我们可以发现:$1$ 和 $0$ 是最最废的东西,一个不会将乘积增多,一个更是会将它“归零”!所以我们枚举是从 $2$ 开始。
5. 但这时,我们发现一个问题:如果剩的值大于数列长度(也就是等于序列最后一个数),我们就要特判了。
比如,当这个整数为 $23$ 时:
拆分出来的数为:
$2$、
$3$、
$4$、
$5$、
$6$。
剩余的部分为:
$3$。
然后将3拆分成 $1+1+1$,分别加入后 $3$ 个,序列为:
$2$、
$3$、
$5$、
$6$、
$7$。
当然,我们无需再判断最后剩余部分为 $1$ 的情况,因为这时剩余部分就至少能再在数列中添加一个数了。
------------
话不多说,上代码!!!
```cpp
#include<bits/stdc++.h>
using namespace std;
int q;
int main()
{
cin>>q;
while(q--)
{
int n;
cin>>n;
int a[1005],c = 0;
//设一个比题目大一点点的数,不会爆炸
for(int i=2;n-i>=0;i++)
{
a[++c]=i;
n=n-i;
}
int k=c;
while(n)
{
a[k]++;
k--;
n--;
}
for(int i=1;i<=c;i++)
cout <<a[i]<<" ";
cout<<endl;
}
return 0;
}
```
------------
###### 蒟蒻的第一篇题解