版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest E - Resistors in Parallel+JAVA大数
题意:
任意一个不大于
的一个数S,S的全部因数i所表示的电阻
并联得到的电阻最小,求该电阻值
例如:数12,则此时的电阻值就是
并联所得
分析:
先将S进行唯一分解:得到
;
且
1.如果仅存在一个
,则必存在一个数
,且电阻不变,为什么电阻不变?因为比较发现
和
不同的因数肯定能除尽
,即电阻都是正无穷,结合并联电阻公式就可以发现其实并没有影响了。
2.如果存在很多个
,同理可证
综上:
注意到
的特点,我们可以得出S中的质因数幂次都是1
注意到并联电阻的特点,我们可以得出S中的质因数要尽量的小
做法:
先进行一个线性筛打表,筛出所有的质数(筛完肯定是从小到大的),然后直接在小于n的范围内累乘
至于最后的电阻大小可以通过并联表达式,结合因数和公式
得出最后结果
JAVA牛逼
import java.math.BigInteger;
import java.util.Scanner;
public class Main
{
static int maxn = 1000;
public static boolean prime[] = new boolean[1009];
public static int primenum[] = new int[1009];
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int cnt = 0;
for (int i = 2; i < maxn; i++) {
prime[i] = true;
}
prime[0] = prime[1] = false;
for (int i = 2; i < maxn; i++) {
if (prime[i])
primenum[cnt++] = i;
for (int j = 0; j < cnt; j++) {
int tmp = i * primenum[j];
if (tmp >= maxn)
break;
prime[tmp] = false;
if (i % primenum[j] == 0)
break;
}
}
int t;
BigInteger n;
t = in.nextInt();
for (int w = 1; w <= t; w++) {
n = in.nextBigInteger();
BigInteger x = BigInteger.valueOf(1);
BigInteger ans = BigInteger.valueOf(1);
for (int j = 0; j < cnt; j++) {
x = x.multiply(BigInteger.valueOf(primenum[j]));
ans = ans.multiply(BigInteger.valueOf(primenum[j] + 1));
if (x.compareTo(n) > 0) {
x = x.divide(BigInteger.valueOf(primenum[j]));
ans = ans.divide(BigInteger.valueOf(primenum[j] + 1));
break;
}
}
BigInteger g = x.gcd(ans);
// System.out.println(g);
x = x.divide(g);
ans = ans.divide(g);
System.out.println(x + "/" + ans);
}
}
}