zoukankan      html  css  js  c++  java
  • Gym 102028E Resistors in Parallel(大数)

    题目链接

    题目大意

      有1~n个电阻,对于(r_i),如果i能被(d^2)整除,那么它的阻值就是无限大,否则就是i。然后有一个集合,集合(S_i)是所有能整除i的j。找一个集合S,集合中的电阻并联起来的阻值最小。

    解题思路

      要想使电阻并联起来阻值最小,那么选的电阻的阻值的倒数要尽量的大,换句话说,电阻的阻值就要尽量的小。所以我们应该选一个数,它的每一位分解质因数,质因子的幂次都是1,并且它们应该尽量的小,数量应该尽量的多。
      于是就从2开始累乘257...直到再乘一个质数就大于n为止,那么并联的阻值就是这个数的值比上它的因数之和,因数之和可以用母函数(sum = ({p_1}^0+{p_1}^1)*({p_2}^0+{p_2}^1)...)求得。当然,这个数很大,所以可以用java来写。

    代码

    import java.math.*;
    import java.util.*;
    public class E {
    	public static void main(String args[]) {
    		int [] u = new int[2000];
    		int [] p = new int[2000];
    		for (int i = 0; i<2000; ++i) p[i] = u[i] = 0;
    		for (int i = 2; i<2000; ++i) {
    			if (u[i]==0) u[i] = p[++p[0]] = i;
    			for (int j = 1; i*p[j]<2000; ++j) {
    				u[i*p[j]] = p[j];
    				if (i%p[j]==0) break;
    			}
    		}
    		Scanner input = new Scanner(System.in);
    		input.hasNext();
    		int T = input.nextInt();
    		while(T-->0) {
    			input.hasNextBigInteger();
    			BigInteger n = input.nextBigInteger();
    			BigInteger fac1 = BigInteger.valueOf(1);
    			BigInteger fac2 = BigInteger.valueOf(1);
    			for (int i = 1; i<=p[0]; ++i) {
    				if (fac1.multiply(BigInteger.valueOf(p[i])).compareTo(n)>0) break;
    				fac1 = fac1.multiply(BigInteger.valueOf(p[i]));
    				fac2 = fac2.multiply(BigInteger.valueOf(p[i]+1));
    			}
    			BigInteger g = fac1.gcd(fac2);
    			fac1 = fac1.divide(g);
    			fac2 = fac2.divide(g);
    			System.out.println(fac1+"/"+fac2);
    		}
    	}
    }
    
    
  • 相关阅读:
    索引唯一性扫描(INDEX UNIQUE SCAN)
    索引范围扫描(INDEX RANGE SCAN)
    算法设计与分析——回溯法算法模板
    操作系统考试复习大纲
    windows cmd 生成文件目录树
    Java 匿名类和lambda表达式
    下载Abook 高等教育出版社网站资料
    操作系统——银行家算法(Banker's Algorithm)
    算法设计与分析——最大团问题(回溯法)
    JVM内存区域
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/13915744.html
Copyright © 2011-2022 走看看