2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest E - Resistors in Parallel+JAVA大数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/w_udixixi/article/details/102089133

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}

任意一个不大于 n n 的一个数S,S的全部因数i所表示的电阻 R i R_i 并联得到的电阻最小,求该电阻值
例如:数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} 并联所得

分析:
先将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 n S\leq n
1.如果仅存在一个 k > 1 k 1 > 1 k>1,这里假设k_1>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 ,且电阻不变,为什么电阻不变?因为比较发现 S 2 S_2 S S 不同的因数肯定能除尽 p 1 2 p_1^{2} ,即电阻都是正无穷,结合并联电阻公式就可以发现其实并没有影响了。
2.如果存在很多个 k > 1 k>1 ,同理可证
综上:
注意到 R i R_i 的特点,我们可以得出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)}}}

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

猜你喜欢

转载自blog.csdn.net/w_udixixi/article/details/102089133