大体题意:
给你一个s,要求拆成2和1的和的形式,要求2的个数是偶数个,1的个数是偶数个,2不比1少,2和1的和为s
求方案数:
思路:
暴力求解即可! 直接枚举2的个数,在枚举1的个数
比如说2有m 个 1有n 个,那么这一组的答案就是( n+m)! / ((n!)*(m!) )
没有细想,直接用java大数了!
但也有教训,对java理解太少, 开数组竟然要用new,试了半小时= = !
import java.util.Scanner;
import java.math.BigInteger;
public class Main{
// @SuppressWarnings("null")
//@SuppressWarnings("null")
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
BigInteger ans,shang,xia,xia2;
//BigInteger a73 = BigInteger.valueOf(10001);
// BigInteger a137 = BigInteger.valueOf(137);
int T ;
T = sc.nextInt();
BigInteger dp[] = new BigInteger[101];
for (int i = 0; i < 101; ++i)dp[i] = BigInteger.valueOf(0);
int sum2 = 0,sum1 = 0;
for (int s = 2; s <= 100; ++s){
for (sum2 = 0;sum2*2 <= s; sum2+=2){
for (sum1 = 0; sum1 <= sum2; sum1 += 2){
if (sum1 + sum2*2 != s)continue;
shang = BigInteger.valueOf(1);
xia = BigInteger.valueOf(1);
xia2 = BigInteger.valueOf(1);
for (int j = 1; j <= (sum1+sum2)/2; ++j){
shang = shang.multiply(BigInteger.valueOf(j));
}
for (int j = 1; j <= sum1/2; ++j){
xia = xia.multiply(BigInteger.valueOf(j));
}
for (int j = 1; j <= sum2/2; ++j){
xia2 = xia2.multiply(BigInteger.valueOf(j));
}
ans = shang.divide(xia.multiply(xia2));
ans = ans.multiply(ans);
dp[s] = dp[s].add(ans);
}
}
//System.out.println(s + " " + dp[s]);;
}
for (int kase = 1; kase <= T; ++kase){
String k ;
int s = 0;
k = sc.next();
s = sc.nextInt();
//if (dp[s] != null)
System.out.println(k + " " + dp[s].toString());
//else System.out.println(k + " " + 0);
}
}
}