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);
		}
	}
}

posted @ 2020-11-02 18:20  shuitiangong  阅读(103)  评论(0编辑  收藏  举报