把一个数分成n个数之和,只要保证每个数都不小于2,那么他们的乘积一定大于等于这个数。
所以从2开始一个数一个数的减,到不能减时,假设剩下k,为了不出现相同的数,要把之前的答案从大到小k个数都加1。
代码:
//
// main.cpp
// 1032 Parliament
//
// Created by Baoli1100 on 15/4/2.
// Copyright (c) 2015年 Baoli1100. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int res[1000];
int main(){
int N;
while(~scanf("%d",&N)){
int len=0;
for(int i=2;N>=i;i++){
res[len++]=i;
N-=i;
}
while(N){
int k=min(N,len);
for(int i=len-k;i<len;i++){
res[i]++;
}
N-=k;
}
for(int i=0;i<len;i++){
printf("%d",res[i]);
if(i==len-1) printf("\n");
else printf(" ");
}
}
return 0;
}