http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1728
1728: 社交网络
Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 206 Solved: 50
Submit Status Web Board
Description
Input
Output
Sample Input
2 2 1 0 1 1 0 3 1 0 1 1 1 0 1 1 1 0
Sample Output
0.500 1.125
HINT
求出第i个人认识的m个人中有(k---m)个男性的可能组合数,然后除以第i个人加上第i个人认识的m个人的总排列方案2^(val[i]+1);
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define N 110
#define met(a, b) memset(a, b, sizeof(a))
using namespace std;
int a[N][N], val[N], dp[40][40];
void Init()
{
for (int i=1; i<40; i++)
dp[i][1] = i, dp[i][0] = 1;
for (int i=2; i<40; i++)
for (int j=2; j<=i; j++)
dp[i][j] = dp[i-1][j] + dp[i-1][j-1];
}
int main ()
{
int t, n, k;
scanf ("%d", &t);
Init();///打表求组合数
while (t--)
{
met (a, 0);
met (val, 0);
scanf ("%d %d", &n, &k);
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
{
scanf ("%d", &a[i][j]);
if (a[i][j])
val[i]++;
}
double cnt = 0;
for (int i=1; i<=n; i++)
for (int j=k; j<=n; j++)
if (val[i] >= j)
cnt += (dp[val[i]][j]*1.0 / pow (2, val[i]+1));
printf ("%.3f\n", cnt);
//printf ("%.3f\n", 1.0/16.0);
}
return 0;
}
/*
5 1
0 1 0 0 0
1 0 1 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 0 0
*/