hdu 1566 奇怪的公式

奇怪的公式

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
  
  
3 4 5

Sample Output
  
  
2 1 2 2 2 1 3 3 2 2 3 6

这道题忒恶心,你懂的。。。本来这题不不知道怎么做,只是猜,这些边必定是递增的。有木有听过哥德巴赫猜想。。。当不知道做法时,可以猜想,也只能猜了,也就是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);
        }

    }

}


  
  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值