题目:zzuli1728;
分析:从图论出发了,其实是组合数学问题;
对于每个点而言,和它相连的边作为一个集合进行排列组合,设异性为i个,则同性为n - i:
∑i=kn(12)i∗(12)n−i∗Cin
∑
i
=
k
n
(
1
2
)
i
∗
(
1
2
)
n
−
i
∗
C
n
i
这里的n代表每个点的度,由于每条边计算两次,最后除2即是结果;
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 30 + 1;
LL dp[MAXN][MAXN];
void init() { //打印杨辉三角,代替组合数
dp[0][0] = 1;
for(int i = 1; i < MAXN; ++i) {
dp[i][0] = 1;
for(int j = 1; j < MAXN; ++j) {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
}
}
}
int main() {
int T; init();
scanf("%d", &T);
while(T--) {
int n, k, ant;
double sum = 0.0;
scanf("%d %d", &n, &k);
for(int i = 0; i < n; ++i) {
int ans = 0;
for(int j = 0; j < n; ++j) {
scanf("%d", &ant);
if(ant) ans++;
}
for(int j = k; j <= ans; j++) {
sum = sum + double(dp[ans][j]) * 1.0 / pow(2, ans);
}
}
printf("%.3lf\n", sum / 2);
}
return 0;
}