Description
给出 n 和 k,求 的值。
其中 表示 n 的阶乘。
Input
输入文件包含多组数据,请处理到文件结束。
每组数据包含两个整数 n 和 k.
*
* 至多 组数据。
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的部分也是可以的。