2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest E - Resistors in Parallel+JAVA大数
题意:
R
i
=
{
∞
如
果
i
能
整
除
任
意
的
非
1
完
全
平
方
数
i
其
他
R_i=\begin{cases} \infty & 如果i能整除任意的非1完全平方数\\ i & 其他 \end{cases}
Ri={∞i如果i能整除任意的非1完全平方数其他
任意一个不大于
n
n
n的一个数S,S的全部因数i所表示的电阻
R
i
R_i
Ri并联得到的电阻最小,求该电阻值
例如:数12,则此时的电阻值就是
R
1
,
R
2
,
R
3
,
R
4
,
R
6
,
R
12
R_1,R_2,R_3,R_4,R_6,R_{12}
R1,R2,R3,R4,R6,R12并联所得
分析:
先将S进行唯一分解:得到
S
=
p
1
k
1
p
2
k
2
…
…
p
n
k
n
S=p_1^{k_1}p_2^{k_2}……p_n^{k_n}
S=p1k1p2k2……pnkn;
且
S
≤
n
S\leq n
S≤n
1.如果仅存在一个
k
>
1
,
这
里
假
设
k
1
>
1
k>1,这里假设k_1>1
k>1,这里假设k1>1,则必存在一个数
S
2
=
p
1
1
p
2
k
2
…
…
p
n
k
n
<
S
S_2=p_1^{1}p_2^{k_2}……p_n^{k_n}<S
S2=p11p2k2……pnkn<S,且电阻不变,为什么电阻不变?因为比较发现
S
2
S_2
S2和
S
S
S不同的因数肯定能除尽
p
1
2
p_1^{2}
p12,即电阻都是正无穷,结合并联电阻公式就可以发现其实并没有影响了。
2.如果存在很多个
k
>
1
k>1
k>1,同理可证
综上:
注意到
R
i
R_i
Ri的特点,我们可以得出S中的质因数幂次都是1
注意到并联电阻的特点,我们可以得出S中的质因数要尽量的小
做法:
先进行一个线性筛打表,筛出所有的质数(筛完肯定是从小到大的),然后直接在小于n的范围内累乘
至于最后的电阻大小可以通过并联表达式,结合因数和公式
得出最后结果
a
n
s
=
S
(
1
+
p
1
)
(
1
+
p
2
)
…
…
(
1
+
p
n
)
ans={{S}\over {(1+p_1)(1+p_2)……{(1+p_n)}}}
ans=(1+p1)(1+p2)……(1+pn)S
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);
}
}
}