很容易想到的卡特兰数,不过复杂度高精度还是挺恶心的。
于是用JAVA秒杀了。
import java.math.BigInteger; import java.util.Scanner; public class Main { static BigInteger[] f=new BigInteger[5005]; static BigInteger[] c=new BigInteger[10005]; static BigInteger MOD; static void init(){ f[0]=BigInteger.valueOf(1); for(int i=1;i<=5000;i++){ f[i]=f[i-1].multiply(BigInteger.valueOf(4*i-2)); f[i]=f[i].divide(BigInteger.valueOf(i+1)); } String str="1"; for(int i=0;i<100;i++)str+="0"; MOD=new BigInteger(str); } public static void main(String[] args){ init(); Scanner cin=new Scanner(System.in); while(cin.hasNext()){ int n=cin.nextInt(); c[0]=BigInteger.valueOf(1); for(int i=1;i<=n;i++){ c[i]=c[i-1].multiply(BigInteger.valueOf(n-i+1)); c[i]=c[i].divide(BigInteger.valueOf(i)); } BigInteger ans=BigInteger.valueOf(0); for(int i=0;i*2<=n;i++){ BigInteger tmp=c[i*2].mod(MOD).multiply(f[i].mod(MOD)); ans=ans.add(tmp); ans=ans.mod(MOD); } System.out.println(ans); } } }