HDU 4002【高精度+欧拉函数+java】

题目:Find the maximum

题意:

如题。

解题思路:

打表后不难找出一条规律:要找的那个数总是2*3*5*7*...这样的值,用递推方法求出所有范围内的这些素数积,从中用二分找出符合的数就行了。比赛的时候,小杰用其独藏的C++高精度模版写了个,TLE,然后cxyue用java过掉了。当时我说用二分查找优化下啊,cxyue说才100个数,二分没多大用,后来那天晚上,小杰跟我说他100多ms过掉了,用了二分。不懂java,下面是鄙人对着类库敲出来的AC代码。顺便一说,为什么类成员变量要定义为static呢,因为只有static数据成员才能被static成员函数调用,main函数是static的。

ContractedBlock.gif ExpandedBlockStart.gif View Code
 1 import java.util.*;
2 import java.io.*;
3 import java.math.BigInteger;
4 import java.util.Scanner;
5
6 public class Main {
7 static final int MAX = 1000;
8 static BigInteger[] Ans = new BigInteger[MAX];
9 public static void getAns()
10 {
11 boolean[] flag = new boolean[MAX];
12 int primeNumber = 0;
13 for(int i = 0; i < MAX; ++i)
14 flag[i] = true;
15 Ans[0] = BigInteger.ONE;
16 for(int i = 2; i < MAX; ++i)
17 {
18 if(flag[i])
19 {
20 ++primeNumber;
21 Ans[primeNumber] = Ans[primeNumber - 1].multiply(BigInteger.valueOf(i));;
22 for(int j = i + i; j < MAX; j += i)
23 {
24 flag[j] = false;
25 }
26 }
27 }
28 }
29
30 public static BigInteger findAns(BigInteger n)
31 {
32 int left = 1, right = 100, mid;
33 while(left + 1 < right)
34 {
35 mid = (left + right) >> 1;
36 if(Ans[mid].compareTo(n) > 0)
37 right = mid - 1;
38 else
39 left = mid;
40 }
41 return Ans[right].compareTo(n) <= 0 ? Ans[right] : Ans[left];
42 }
43 public static void main(String[] args) throws IOException {
44 //FileInputStream ios = new FileInputStream("in.txt");
45 //System.setIn(ios);
46 Scanner cin = new Scanner(System.in);
47 getAns();
48 int t = cin.nextInt();
49 while(t-- > 0)
50 {
51 String n = new String();
52 n = cin.next();
53 BigInteger bn = new BigInteger(n);
54 System.out.println(findAns(bn).toString());
55 }
56 }
57 }

转载于:https://www.cnblogs.com/Kenfly/archive/2011/09/09/2172422.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值