题意:n个电阻,电阻Ri的阻值
r
i
=
{
∞
if
i
是
平
方
数
i
r_i = \begin{cases}\infty &\text{if } i是平方数 \\i\end{cases}
ri={∞iif i是平方数
定义第i种电阻集合
S
i
=
{
j
∣
i
%
j
=
=
0
}
S_i=\{j\mid i\%j ==0\}
Si={j∣i%j==0},给定n,找出一个集合
S
i
S_i
Si使得
S
i
S_i
Si内电阻并联后阻值最小,输出最简分式。
思路:因为
x
%
d
2
=
0
x\%d^2=0
x%d2=0时电阻为0,所以我们只用考虑x不同因子的数量和大小,贪心的思考,质因子越小,越多,答案越小。所以我们要构造一个数
2
∗
3
∗
4
∗
.
.
.
∗
p
m
a
x
⩽
n
2*3*4*...*p_{max}\leqslant n
2∗3∗4∗...∗pmax⩽n,那么答案就是
a
n
s
=
1
∑
i
=
1
,
n
%
i
=
0
n
1
i
ans=\dfrac{1}{\sum_{i=1,n\%i=0}^{n}\dfrac{1}{i}}
ans=∑i=1,n%i=0ni11
代码
import java.math.*;
import java.util.Scanner;
import javax.sound.midi.VoiceStatus;
public class Main {
static long prime[]=new long[1005];
static boolean isprime[] = new boolean[1005];
static BigInteger fz[] = new BigInteger[1005],fm[] =new BigInteger[1005];
static BigInteger array[]= new BigInteger[1005];
static int cnt,T,tot;
static void getPrime() {
for(int i=0;i<1005;i++) isprime[i] = false;
cnt=0;
for(int i=2;i<1005;i++) {
if(!isprime[i])prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<1005;j++) {
isprime[(int)(i*prime[j])]=true;
}
}
}
static void init() {
BigInteger Max =BigInteger.ONE;
for(int i=1;i<=100;i++)Max=Max.multiply(BigInteger.TEN);
BigInteger res=BigInteger.ONE;
fz[0]=BigInteger.ONE;
fm[0]=BigInteger.ONE;
array[0]=BigInteger.ZERO;
for(int i=1;i<=cnt;i++) {
res=res.multiply(BigInteger.valueOf(prime[i]));
array[i]=res;
if(res.compareTo(Max)>0)break;
fm[i]=fm[i-1].multiply(BigInteger.valueOf(prime[i]).add(BigInteger.ONE));
fz[i]=fz[i-1].multiply(BigInteger.valueOf(prime[i]));
BigInteger gcd=fz[i].gcd(fm[i]);
fz[i]=fz[i].divide(gcd);
fm[i]=fm[i].divide(gcd);
}
}
public static void main(String[] args) {
getPrime();
init();
BigInteger n;
Scanner scanner =new Scanner(System.in);
T=scanner.nextInt();
while ((T--)!=0) {
n=scanner.nextBigInteger();
if(n.compareTo(BigInteger.ONE)==0) {
System.out.println("1/1");
continue;
}
int idx=0;
for(int i=1;;i++) {
if(n.compareTo(array[i])==0) {
idx=i;
break;
}
if(n.compareTo(array[i-1])>0&&n.compareTo(array[i])<0) {
idx=i-1;
break;
}
}
if(fz[idx]==fm[idx])System.out.println("1/1");
else System.out.println(fz[idx]+"/"+fm[idx]);
}
}
}