hdu 1566 奇怪的公式

来源:互联网 发布:软件测试 培训 推荐 编辑:程序博客网 时间:2024/05/08 13:40

奇怪的公式

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 202 Accepted Submission(s): 65

Problem Description
alpc12是个满脑子奇怪思想的孩子.新年到了,他想做做数学题,但是发现多边形的面积公式好复杂,于是他将其修改为S = a*b*c*d*...(a, b, c, d..是边且为正数且所有边不相等),alpc12的老师alpc01看他如此偷懒,作为惩罚,决定好好考考他。于是alpc01问:" 现在知道这个多边形的周长,这个多边形的面积最大为多少呢?而且,这回可不许你乱改周长公式哦!"

Input
多个测试情况.每行输入n(3 <= n <= 1000),代表多边形周长,读到文件尾(EOF结束)。

Output
对于每个输入的n,输出2行,
第一行:多边形的边数,然后是单调不降的各边的长度.
第二行:这个多边形的面积的最大值.
输出不要有任何的无用字符

Sample Input
345

Sample Output
2 1 222 1 332 2 36

这道题忒恶心,你懂的。。。本来这题不不知道怎么做,只是猜,这些边必定是递增的。有木有听过哥德巴赫猜想。。。当不知道做法时,可以猜想,也只能猜了,也就是YY^_^
本来用C++做的,但涉及到大数,太恶心了,后来改用java,Pe了,这时我心动了,因为我的猜想是对的。。。。。。。。。。。PE原因是因为 他是一行判断边,再一行判断面积。
解法:
从i=2开以始,一真做k=n-i;i++;      真到i>k,这时,可以确定有i-2条边,这时将最k逆向循环分给这些连,分到k=0为止,此时面积s=这些边的积。
不要问我为什么,我无法证明。。
import java.io.BufferedInputStream;import java.math.BigInteger;import java.util.Scanner;public class Main {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        Scanner cin=new Scanner(new BufferedInputStream(System.in ));        int n,i,j,k;        BigInteger sum = null;        while(cin.hasNext()){            n=cin.nextInt();            if(n<5){                if(n==3)System.out.println("2 1 2");                else if(n==4)System.out.println("2 1 3");                sum=BigInteger.valueOf(n-1);            }else{            k=n;sum=BigInteger.valueOf(1);            for(i=2;i<=k;i++)k-=i;            if(k==0){                System.out.print(i-2);                k=1;                for(j=2;j<i;j++){                    System.out.print(" "+j);                    sum=sum.multiply(BigInteger.valueOf(j));                }                System.out.println();            }else{                n=k%(i-2);//余数                k=(k/(i-2));//增加的偏移量                System.out.print(i-2);                j=2+k;                i+=k;                for(;j<i-n;j++){                    System.out.print(" "+j);                    sum=sum.multiply(BigInteger.valueOf(j));                }                for(j=j+1;j<=i;j++){                    System.out.print(" "+j);                    sum=sum.multiply(BigInteger.valueOf(j));                }                System.out.println();            }                    }            System.out.println(sum);        }    }}


原创粉丝点击