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

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={ii1

任意一个不大于 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=p1k1p2k2pnkn;
S ≤ n S\leq n Sn
1.如果仅存在一个 k > 1 , 这 里 假 设 k 1 > 1 k>1,这里假设k_1>1 k>1k1>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=p11p2k2pnkn<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);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值