利用卡特兰数变形。
同样的方法:沿y=x-1这条直线对称过去
求得结果为:C(n+m,n)-C(n+m,n+1);
JAVA 300ms
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static BigInteger C(int n,int m){
BigInteger res = BigInteger.valueOf(1);
for(int i=n-m+1;i<=n;i++)
res = res.multiply(BigInteger.valueOf(i));
for(int i=1;i<=m;i++)
res = res.divide(BigInteger.valueOf(i));
return res;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n,m;
n=cin.nextInt();
m=cin.nextInt();
BigInteger ans = C(n+m,n).subtract(C(n+m,n+1));
System.out.println(ans);
}
}
C++大数大概2-3s 慢了个常数,知道方法就行
#include <bits/stdc++.h&