PS:选拔赛的时候时间不够,没做到这道题,还是太菜。其实这题不是很难,都有提示是高精度和贪心,所以仔细想一下就发现把n从2开始分,下一次分的数加1就行了,当最后一个数比n大时就停止,把多的n从后往前补,要优先补大的数,最后用java中的bigintger计算高精度乘法即可。注意数据范围是从3开始,而我们从2开始分的话,最小都要从5开始,因此特判一下3,4即可。
import java.util.Scanner;
import java.math.*;
import java.text.*;
public class Main{
public static void main(String args[]){
int n, i, j;
BigInteger a=new BigInteger("1");
int ans[]=new int[1005];
Scanner cin = new Scanner ( System.in );
n=cin.nextInt();
if(n==3||n==4){
System.out.println(1+" "+(n-1));
System.out.println((n-1));
}
else{
i=2;
while(n>=i){//从2开始放数
ans[i]=i;
n-=i;
i++;
}
i--;
j=i;
while(n>0&&j>=2){//n还有剩余就从后往前放数
ans[j--]++;
n--;
}
if(n==1)ans[i]++;//这个有可能放了一遍还剩一个,就再把最大那个数加1
for(j=2;j<=i;j++){
System.out.print(ans[j]);
System.out.print(" ");
}
System.out.println("");
for(j=2;j<=i;j++){
BigInteger b= new BigInteger("" + ans[j]);
a=a.multiply(b);//大数想乘
}
System.out.println(a);
}
}
}