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