HDU 4392 反素数java

网上找的模板能求10^80次方以内的。

import java.io.BufferedInputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner; 

class Node
{
    private static final int MAXP = 60; 

    public BigInteger K;
    public long F;
    public int N;
    public int[] A; 

    public Node()
    {
        K = BigInteger.ZERO;
        A = new int[MAXP];
    }
} 

public class Main
{
    private static final int MAXIP = 250;
    private static final int MAXP = 60; 

    private static BigInteger[] prime; 

    private static void init()
    {
        boolean[] isPrime = new boolean[MAXIP];
        for(int i=0;i<MAXIP;++i)
        {
            isPrime[i] = true;
        }
        isPrime[0] = isPrime[1] = false;
        for(int i=4;i<MAXIP;i+=2)
        {
            isPrime[i] = false;
        }
        for(int i=3;i<MAXIP;i+=2)
        {
            for(int j=3;i*j<MAXIP;j+=2)
            {
                isPrime[i*j] = false;
            }
        }
        prime = new BigInteger[MAXP];
        for(int i=0, j=0;i<MAXIP;++i)
        {
            if(isPrime[i])
            {
                prime[j++] = BigInteger.valueOf(i);
            }
        }
    } 

    public static void main(String args[])
    {
        init();
        List<BigInteger> P = new ArrayList<BigInteger>();
        BigInteger MP = BigInteger.ZERO;
        List<Node> ans = new ArrayList<Node>();
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        while(cin.hasNext())
        {
            BigInteger temp = cin.nextBigInteger();
            P.add(temp);
            if(temp.compareTo(MP) == 1)
            {
                MP = temp;
            }
            ans.add(new Node());
        }
        Map<Long, BigInteger> map = new HashMap<Long, BigInteger>();
        Queue<Node> queue = new LinkedList<Node>();
        Node origin = new Node();
        origin.K = BigInteger.ONE;
        origin.F = 1;
        origin.N = 0;
        queue.add(origin);
        map.put(origin.F, origin.K);
        while(!queue.isEmpty())
        {
            Node u = queue.peek();
            queue.remove();
            BigInteger compare = map.get(u.F);
            if(compare != null)
            {
                if(compare.compareTo(u.K) == -1)
                {
                    continue;
                }
            }
            for(int i=0;i<P.size();++i)
            {
                if(u.K.compareTo(P.get(i)) <= 0)
                {
                    if(u.F > ans.get(i).F)
                    {
                        ans.get(i).F = u.F;
                        ans.get(i).K = u.K;
                    }
                    else if(u.F == ans.get(i).F)
                    {
                        if(u.K.compareTo(ans.get(i).K) == -1)
                        {
                            ans.get(i).K = u.K;
                        }
                    }
                }
            }
            for(int i=0;i<u.N;++i)
            {
                Node v = new Node();
                v.K = u.K.multiply(prime[i]);
                if(v.K.compareTo(MP) <= 0)
                {
                    v.F = u.F / (u.A[i] + 1) * (u.A[i] + 2);
                    v.N = u.N;
                    for(int j=0;j<u.N;++j)
                    {
                        v.A[j] = u.A[j];
                    }
                    ++ v.A[i];
                    boolean flag = true;
                    compare = map.get(v.F);
                    if(compare != null)
                    {
                        if(compare.compareTo(v.K) <= 0)
                        {
                            flag = false;
                        }
                        else
                        {
                            map.remove(v.F);
                        }
                    }
                    if(flag)
                    {
                        queue.add(v);
                        map.put(v.F, v.K);
                    }
                }
            }
            Node v = new Node();
            v.K = u.K.multiply(prime[u.N]);
            if(v.K.compareTo(MP) <= 0)
            {
                v.F = u.F * 2;
                v.N = u.N + 1;
                for(int i=0;i<u.N;++i)
                {
                    v.A[i] = u.A[i];
                }
                ++ v.A[u.N];
                boolean flag = true;
                compare = map.get(v.F);
                if(compare != null)
                {
                    if(compare.compareTo(v.K) <= 0)
                    {
                        flag = false;
                    }
                    else
                    {
                        map.remove(v.F);
                    }
                }
                if(flag)
                {
                    queue.add(v);
                    map.put(v.F, v.K);
                }
            }
        }
        for(int i=0;i<ans.size();++i)
        {
            System.out.println(ans.get(i).K.toString() + " " + ans.get(i).F); //第一个数为满足因子个数最多的K,第二个数为K的因子个数
        }
    }
} 
时间: 2025-01-20 13:26:55

HDU 4392 反素数java的相关文章

求助 CLASS文件反编成 JAVA源文件后,重编译出错

问题描述 没搞过JAVA,因为要用一个专业软件分析数据,网上的XX版没搞好,只好自已试试了,基本过程就是从JAR文件中解出一个CLASS文件,然后用DJJAVADecompiler反编成JAVA源文件,进行小小修改(就是XXOO啦,呵呵)前面都搞好后进行重编译,提示错误"软件包com.treestar.flowjo.application.workspace不存在"此JAVA源文件开头有很多import语句,应该是引用这些类的声明,估计是编译程序找不到这些类,所以提示找不到请问高手们如

java中的字符数组反序-java中怎么将一个字符数组反序

问题描述 java中怎么将一个字符数组反序 新手java中怎么将一个字符数组反序,不要new数组,只能使用一个字符数组,三克油 解决方案 可以用Collection.reverse(list)呀,先把你的数组放到List里,再Collection.reverse(list),然后再从list中拿回来,示例代码: public static void main(String[] args) { String[] deal = new String[3]; deal[0] = "0"; d

求素数-java 求解大于Long.MAX_VALUE的五个素数。。。

问题描述 java 求解大于Long.MAX_VALUE的五个素数... 为什么运行没有结果啊!!!等着交作业呢...求一个简化的程序...至少能让我算出数字啊!!!或者大神帮我找一下错误啊...跪求啊!!!! import java.math.*; public abstract class FindFivePrime{ public static void main(String[] args){ BigDecimal i = new BigDecimal(Long.MAX_VALUE);

反编译-java混淆编译如何混淆具体方法

问题描述 java混淆编译如何混淆具体方法 关于java混淆编译 用了jocky跟proguard混淆后 反编译发现类方法中的计算方法还是明文的,有大神知道怎么办吗? 具体情况是我要编译个jar包给别人用,具体类里面有计算方法. 我想要的效果是编译成jar之后别人反编译看不懂这个计算方法 解决方案 在项目架到正式环境时可以加混淆器,通过ant和maven利用代码混淆加密打包. 这个问题的帖子参考:http://www.iteye.com/problems/47428

HDOJ(HDU) 2161 Primes(素数打表)

Problem Description Write a program to read in a list of integers and determine whether or not each number is prime. A number, n, is prime if its only divisors are 1 and n. For this problem, the numbers 1 and 2 are not considered primes. Input Each i

HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)

Problem Description As the increase of population, the living space for people is becoming smaller and smaller. In MagicStar the problem is much worse. Dr. Mathematica is trying to save land by clustering buildings and then we call the set of buildin

谈谈JAVA程序的反编译

编译|程序   谈谈JAVA程序的反编译  如今JAVA语言在全世界范围正如火如荼般的流行,它广范地应用在INTERNET的数据库.多媒体.CGI.及动态网页的制作方面.1999年在美国对JAVA程序员的需求量首次超过C++! 最近分析一些JAVA程序,对JAVA的反编译进行了一番了解,下面将我所了解的情况作以下介绍,希望对JAVA爱好者有所帮助. JAVA是采用一种称做"字节编码"的程序结构,分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型.无论哪种结构,

Java列出2到100之间所有素数的方法_java

本文实例讲述了Java列出2到100之间所有素数的方法.分享给大家供大家参考.具体实现方法如下: //TestPrime.java: public class TestPrime { public static boolean isPrime(int num) { for(int i = 2; i <= Math.sqrt(num); i++) { //程序默认2是素数,当j=2时,循环不执行 if(num % i == 0) { return false; } } return true; }

Java中的常量避免反模式的方法_java

在应用中,我们往往需要一个常量文件,用于存储被多个地方引用的共享常量.在设计应用时,我也遇到了类似的情况,很多地方都需要各种各样的常量. 我确定需要一个单独的文件来存储这些静态公共常量.但是我不是特别确定是应该用接口还是类(枚举不满足我的需求).我有两种选择: 使用接口,如: package one; public interface Constants { String NAME="name1"; int MAX_VAL=25; } 或 package two; public cla