(Java)
导入java.math。大整数;
公共类AtMostTwoOnes{
公共静态void main(String[]args){
对于(int n=0;n<=40;n++){
BigInteger[][][]计数=新的BigIntiger[n+1][n+1];//counts[m][k][l]:k列和为0,l列和为1的mxn矩阵的数目
对于(int k=0;k<=n;k++)
对于(int l=0;l<=n;l++)
counts[0][k][l]=BigInteger。归零;
counts[0][n][0]=大整数。一个;//只有一个0xn矩阵,所有n列总和为0
对于(int m=1;m<=n;m++){
BigInteger[][]旧=计数[m-1];
对于(int k=0;k<=n;k++)
对于(int l=0;l<=n;l++){
BigInteger和=BigIntiger。归零;
//新行不包含1s
sum=sum.add(旧[k][l]);
//新行包含一个1
//添加到列总和0
如果(k<n&&l>0)
sum=sum.add(旧[k+1][l-1].乘法(BigInteger.valueOf(k+1));
//添加到列总和1
如果(l<n)
sum=sum.add(旧[k][l+1].multy(BigInteger.valueOf(l+1)));
//新行包含两个1
//添加到两列总和0
如果(k<n-1&&l>1)
sum=sum.add(旧[k+2][l-2].multy(BigInteger.valueOf(((k+2)*(k+1))/2));
//添加到一列总和0,一列总和1
如果(k<n)
sum=sum.add(旧[k+1][l].multiply(BigInteger.valueOf((k+1)*l)));
//添加到两列总和1
如果(l<n-1)
sum=sum.add(旧[k][l+2].乘(BigInteger.valueOf(((l+2)*(l+1))/2));
计数[m][k][l]=总和;
}
}
BigInteger和=BigIntiger。归零;
对于(int k=0;k<=n;k++)
对于(int l=0;l<=n;l++)
sum=sum.add(计数[n][k][l]);
System.out.println(n+“:”+总和);
}
}
}
|