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);
    		}
    	}
    }
    
    
  • 相关阅读:
    P2056 [ZJOI2007]捉迷藏
    P2993 [FJOI2014]最短路径树问题
    P4149 [IOI2011]Race 点分治
    P2634 [国家集训队]聪聪可可 点分治
    [APIO2008]免费道路
    [luogu4255]公主の#18文明游戏
    [ZJOI2010]基站选址
    [POI2011]Meteors
    [SCOI2015]国旗计划
    [BZOJ4373]算术天才⑨与等差数列
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/13915744.html
Copyright © 2011-2022 走看看