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);
    		}
    	}
    }
    
    
  • 相关阅读:
    call()与apply()的作用与区别
    Tomcat8/9的catalina.out中文乱码问题解决
    怎样查看Jenkins的版本
    每日日报2020.8.18
    528. Random Pick with Weight
    875. Koko Eating Bananas
    721. Accounts Merge
    515. Find Largest Value in Each Tree Row
    286. Walls and Gates (Solution 1)
    408. Valid Word Abbreviation
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/13915744.html
Copyright © 2011-2022 走看看