对于dp[ i ][ j ] , 设 i 的二进制中 1 的个数为 Si。
则dp[ i ][ j ]表示在前Si行中,选取 i 的二进制对应的列所能得到分数 j 的方案数。
则递推方程为:
dp[ t ][ k ] += dp[ i ][ j ] , Si +1 == St && (t 的二进制与 i 的二进制有且只有一位不一样,换言之,只能在Sl行选取未在前 Si 行选取的一个列)。
最后 dp[1<<(n-1)][m]即为可行方案总数,而总的方案数为 n!。
又因此为01分布,所以期望为 dp[1<<(n-1)][m]/(n!),求出最大公约数化简即可。
#include
#include
#include
#include
#include
#include
#include
#include
#include