【ACM】2019湖南省赛 B 组合数

Description

给出 n 和 k,求 \min \left \{\frac{n!}{k!\left (n-k \right )!} ,10^{18} \right \}的值。

其中 n!= 1\times 2\times 3\times ...\times n表示 n 的阶乘。

Input

输入文件包含多组数据,请处理到文件结束。

每组数据包含两个整数 n 和 k.

*0\leq k\leq n\leq 10^{9}

* 至多 10^{5}组数据。

Output

对于每组数据,输出一个整数,表示所求的值。

Sample Input 1 

1000000000 0
1000000000 2
1000000000 500000000

Sample Output 1

1
499999999500000000
1000000000000000000

思路:

java大数暴力一下即可。k大于60多就会爆,保险起见写了100,详见代码。

代码:

import java.math.BigInteger;
import java.util.*;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String cmp1 = "1000000000000000000";
		BigInteger cmp = new BigInteger(cmp1);
		Scanner reader = new Scanner(System.in);
		while(reader.hasNext()) {
			int n = reader.nextInt();
			int k = reader.nextInt();
			reader.nextLine();
			if(n - k < k)
				k = n - k;
			if(k > 100) {
				System.out.println(cmp);
				continue;
			}
			long m = 1;
			BigInteger ans1 = new BigInteger("1");
			BigInteger ans2 = new BigInteger("1");
			for(long i = n - k + 1;i <= n;i ++) {
				ans1 = ans1.multiply(new BigInteger(String.valueOf(i)));
				ans2 = ans2.multiply(new BigInteger(String.valueOf(m)));
				//System.out.println(ans1 + " " + ans2);
				m++;
				BigInteger g = ans1.gcd(ans2);
				if(g != BigInteger.ONE) {
					ans1.divide(g);
					ans2.divide(g);
				}
			}
			ans1 = ans1.divide(ans2);
			if(ans1.compareTo(cmp) == 1)
				System.out.println(cmp);
			else
				System.out.println(ans1);
		}
	}
}

10.3更新

突然发现这套题被放到牛客上去了

放一个补题链接:https://ac.nowcoder.com/acm/contest/1099/B

其实去掉求gcd的部分也是可以的。

猜你喜欢

转载自blog.csdn.net/qq_41279172/article/details/100387968