我已经用Java编写了以下问题的代码,并在我的机器上得到了正确的答案。但是当我在SPOJ上提交它时,它会给出TLE(超出时间限制)错误。 有人可以帮我纠正/即兴吗?
[问题] :http://www.spoj.com/problems/WILLITST/
以下是我尝试的代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.ArrayList;
class WILLITST {
public static void main(String[] args) throws Exception {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BigInteger n=BigInteger.valueOf(Long.parseLong(br.readLine()));
ArrayList<BigInteger> al=new ArrayList<BigInteger>();
BigInteger x=BigInteger.valueOf(2);
BigInteger y=BigInteger.valueOf(3);
while(n.compareTo(BigInteger.ONE)==1){
al.add(n);
if(n.mod(x) == BigInteger.ZERO)
n=n.divide(x);
else n=y.multiply(n).add(y);
if(al.contains(n))
{
System.out.println("NIE");
return;
}
}
System.out.println("TAK");
}
}
提前致谢。
答案 0 :(得分:0)
成功提交以下代码,没有TLE:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.HashSet;
import java.util.Set;
class WILLITST_BigInteger {
public static void main(String[] args) throws Exception {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BigInteger n=BigInteger.valueOf(Long.parseLong(br.readLine()));
Set<BigInteger> s=new HashSet<BigInteger>();
BigInteger x=BigInteger.valueOf(2);
BigInteger y=BigInteger.valueOf(3);
while(n.compareTo(BigInteger.ONE)==1){
if(!s.add(n)){
System.out.println("NIE");
return;
}
if((n.and(n.subtract(BigInteger.ONE))).equals(BigInteger.ZERO)){
System.out.println("TAK");
return;
}
if((n.and(BigInteger.ONE)).equals(BigInteger.ZERO))
n=n.divide(x);
else n=y.multiply(n).add(y);
}
System.out.println("TAK");
}
}