zoukankan      html  css  js  c++  java
  • bzoj 1225 dfs + 一点点数论

    思路:有一个公式  如果 x = a1 ^ b1 * a2 ^ b2 * ...... * an ^ bn 其中ai为质数,那么总共的因子个数为 (b1 + 1) * (b2 + 1) *....* (bn + 1),

    可得最多只和前16个质数有关,那么我们dfs暴力枚举每个质数的指数个数,注意因为值很大,所以比较过程用了log,后面上个大数输出。

     
    import java.math.BigInteger;
    import java.util.*;
     
     
    public class Main {
        static int n;
        static int prime[] = {0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
        static int ret[] = new int[17];
        static int tmp[] = new int[17];
        static double lg[] = new double[17];
        static double mn = 100000000000000000.0;
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
             
            n = in.nextInt();
             
            for(int i = 1; i <= 16; i++) {
                lg[i] = Math.log(prime[i]);
            }
             
            dfs(0.0, n, 1, 1000000);
             
            BigInteger ans = BigInteger.valueOf(1);
            for(int i = 1; i <= 16; i++) {
                for(int j = 1; j <= ret[i]; j++) {
                    ans = ans.multiply(BigInteger.valueOf(prime[i]));
                }
            }
            System.out.println(ans);
            in.close();
        }
         
        static void dfs(double x, int y, int z, int pre) {
            if(x >= mn) return;
            if(y == 1) {
                mn = x;
                for(int i = 1; i <= 16; i++) {
                    ret[i] = 0;
                    if(i <= z - 1) {
                        ret[i] = tmp[i];
                    }
                }
                return;
            }
            if(z > 16) return;
            for(int i = 0; (i + 1) * (i + 1) <= y; i++) {
                if(y % (i + 1) == 0) {
                    if(i != 0 && i <= pre) {
                        tmp[z] = i;
                        dfs(x + lg[z] * i, y / (i + 1), z + 1, i);
                    }
                     
                    if((i + 1) * (i + 1) != y && y / (i + 1) - 1 <= pre) {
                        tmp[z] = y / (i + 1) - 1;
                        dfs(x + lg[z] * (y / (i + 1) - 1), i + 1, z + 1, y /(i + 1) - 1);
                    }
                }
            }
        }
    }
  • 相关阅读:
    致虚极守静笃
    DNS 透明代理
    Java“禁止”泛型数组
    Java和C#语法对比
    JVM 内存区域 (运行时数据区域)
    Java8 使用
    G1收集器的收集原理
    BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】
    数据结构之网络流入门(Network Flow)简单小节
    BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
  • 原文地址:https://www.cnblogs.com/CJLHY/p/9174999.html
Copyright © 2011-2022 走看看