1728: 社交网络(概率问题 组合数/排列数)
1728: 社交网络
时间限制: 2 Sec 内存限制: 128 MB提交: 393 解决: 100
[提交][状态][讨论版][命题人:admin]
题目描述
输入
输出
样例输入
2
2 1
0 1
1 0
3 1
0 1 1
1 0 1
1 1 0
样例输出
0.500
1.125
提示
/* 第 i个人 认识 m 个人 则 i 人是交际花的情况是 男人数量为 【k,m】个 这个区间成立的组合数之和C(m , k)--- C(m , m) 除以 m+1人的排列数 pow(2,m+1) */ #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <cstdio> using namespace std ; #define maxn 45 int t , n , k ; int map[maxn][maxn] ; int C[maxn][maxn] ; int value[maxn] ; // 求组合数 C[i][j] 表示 组合 C(i,j) 的值 void init(){ memset(C , 0 , sizeof(C)) ; for(int i=1 ; i<maxn ; i++){ C[i][0] = 1 ; C[i][1] = i ; } for(int i=2 ; i<maxn ; i++){ for(int j=2 ; j<=i ; j++){ C[i][j] = C[i-1][j] + C[i-1][j-1] ; } } return; } int main(){ init() ; cin >> t ; while(t--){ memset(value , 0 , sizeof(value)) ; cin >> n >> k ; for(int i=1 ; i<=n ; i++){ for(int j=1 ; j<=n ; j++){ cin >> map[i][j] ; if(map[i][j]){ value[i] ++ ; } } } double result = 0 ; for(int i=1 ; i<=n ; i++){ for(int j=k ; j<=value[i] ; j++){ result += (C[value[i]][j] * 1.0) / pow(2 , value[i] + 1 ) ; } } printf("%.3f\n" , result) ; } return 0 ; }