#include

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 ; 
}

 

posted @ 2018-04-25 00:35  0一叶0知秋0  阅读(564)  评论(0编辑  收藏  举报