水~ZOJ 4091 Even Number Theory

本文详细解析了 ZJU ACM 4091 题目的解题思路,通过分析偶数连乘问题,探讨如何将连乘结果分解为 e-prime 的乘积形式,采用 Java 大数处理方法实现高效计算。

题目链接 : http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4091

题意

写了一大段定义,其实就是给定一个n (n为偶数),求n!!(其实就是2~n的偶数连乘)最多能分解成几个 e-prime 相乘

因为2是最小的 e-prime 所以肯定是尽可能多的分解出2

思路

仔细推理一下不难发现,一个数能提供的e-prime的个数就在于能整除2几次,所以在2~n的偶数,给定的n一定为偶数,所以连乘的数的个数为n/2个,然后能分解出一个e-prime的数(其实是不可分)有(n/2)/2+(n/2)%2个数,能分解为两个的就是(n/2/2)/2+(n/2/2)%2,以此类推...

最后的代码就很简单了,不过范围是2~1e1000,所以直接java大数就可以解决

AC代码

import java.math.*;
import java.util.*;

public class Main {
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		int T;
		BigInteger zero = BigInteger.valueOf(0);
		BigInteger cnt;
		BigInteger tmp;
		BigInteger n;
		BigInteger ans;
		T = scanner.nextInt();
		while(T != 0) {
			T--;
			cnt = BigInteger.valueOf(1);
			ans = BigInteger.valueOf(0);
			n = scanner.nextBigInteger();
			n = n.divide(BigInteger.valueOf(2));
			while(!n.equals(zero)) {
				tmp = n.divide(BigInteger.valueOf(2)).add(n.mod(BigInteger.valueOf(2)));
				ans = ans.add(tmp.multiply(cnt));
				n = n.divide(BigInteger.valueOf(2));
				cnt = cnt.add(BigInteger.valueOf(1));
			}
			System.out.println(ans);
		}
	}
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值