ACM-ICPC 2018 焦作赛区网络预赛_J_ Participate in E-sports_Java大数开方

传送门

题意:求n和 1+2+3+….+(n-1) 这两个数字是不是完全平方数。
思路:大数开方,似乎是板子太弱了,在做第二个数字的时候T掉了,然后我就思考下满足(n-1)*n/2为完全平方数的数字并不多,预处理出来就可以。

import java.io.BufferedInputStream;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    static Scanner in = new Scanner(System.in);
    public static int N = 600;
    public static void main(String[] args) {

         BigInteger res[] = new BigInteger[N];
         BigInteger one = BigInteger.ONE;
         BigInteger two = one.add(one);
         BigInteger six = two.add(two).add(two);
         res[0]=BigInteger.ZERO;
         res[1]=one;
         res[2]=two;
         for(int i=3;i<N;i++) {
             res[i]=six.multiply(res[i-1]).subtract(res[i-2]).subtract(two);
         }

         int T = in.nextInt();
         while(T-- != 0) {
              BigInteger n; n = in.nextBigInteger();

              int flag1=0,flag2=0;
              flag1=isSq(n);
              for(int i=0;i<N;i++) {
                  if(res[i].compareTo(n)==0) {
                      flag2=1;
                      break;
                  }
              }

              if(flag1==1 && flag2==1) {
                  System.out.println("Arena of Valor");
              }else if(flag1==0 && flag2==1) {
                  System.out.println("Clash Royale");
              }else if(flag1==1 && flag2==0) {
                  System.out.println("Hearth Stone");
              }else if(flag1==0 && flag2==0) {
                  System.out.println("League of Legends");
              }
            }   
         }

        public static int  isSq(BigInteger  n) {
            BigInteger l = BigInteger.ZERO;
            BigInteger r = BigInteger.ONE;
            while(r.pow(2).compareTo(n) != 1) {     
                  l = r;
                  r = r.multiply(BigInteger.valueOf(2));
              }
              while(l.add(BigInteger.valueOf(1)).compareTo(r) == -1) {   
                  BigInteger mid = (l.add(r)).divide(BigInteger.valueOf(2));
                  if(mid.pow(2).compareTo(n) != 1) {   
                      l = mid;
                  } else {
                      r = mid;
                  }
              }
              BigInteger ans1;
              if(r.pow(2).compareTo(n) != 1) {
                  ans1 = r;
              } else {
                  ans1 = l;
              }
              if(ans1.multiply(ans1).compareTo(n)==0) return 1;
              else return 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值