1. 程式人生 > 實用技巧 >Gym 102028E Resistors in Parallel(大數)

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