Gym 102028E Resistors in Parallel(大數)
阿新 • • 發佈:2020-11-02
題目大意
有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)...\)
程式碼
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); } } }