2015轻院校赛 D 社交网络(排列组合)

http://acm.zznu.edu.cn/problem.php?id=1964

题目描述

输入

输出

样例输入

2
2 1
0 1
1 0
3 1
0 1 1
1 0 1
1 1 0

样例输出

0.500
1.125

提示

之前想了一个公式  就是0.5*pow(0.5,k)*C(k,n);

k是至少认识k个人   n是认识n个人

后来队友都把所有的东西都写出来了我才去验证第二个测试数据  发现是错的  当时真的想自己从五楼上跳下来

正确的公式应该是

for(i=k;i<=n;i++)

{

  ans+=0.5*pow(0.5,n)*C(i,n);

}

现在想想真是很有道理啊

当时为啥就是蒙蔽呢

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>

using namespace std;

int num[50];
int x1[50];
int x2[50];
int s[50][50];

void Init(int n)
{
    memset(s, 0, sizeof(s));
    for(int i=1; i<=n; i++)
    {
        int x=i;
        for(int j=2; j<=i; j++)
        {
            if(x%j==0)
            {
                s[i][j]++;
                x/=j;
                j--;
            }
        }
    }
}

long long c(int n, int k)
{
    memset(x1, 0, sizeof(x1));
    memset(x2, 0, sizeof(x2));
    for(int i=2; i<=k; i++)
    {
        for(int j=2; j<=i; j++)
        {
            x1[j] += s[i][j];
        }
    }
    for(int i=n-k+1; i<=n; i++)
    {
        for(int j=2; j<=i; j++)
        {
            x2[j] += s[i][j];
        }
    }
    for(int i=2; i<=30; i++)
    {
        x2[i]-=x1[i];
    }
    long long ans=1;
    for(int i=2; i<=30; i++)
    {
        for(int j=1; j<=x2[i];j++)
        {
            ans*=i;
        }
    }
    return ans;
}

double solve(int n, int k)
{
    double ans=0;
    for(int i=k;i<=n;i++)
    {
        ans += 0.5*c(n, i)*pow(0.5, n);
    }

    return ans;
}

int main()
{
    int t;
    int n, k;
    int x;
    scanf("%d", &t);
    Init(30);
    while(t--)
    {
        scanf("%d%d", &n, &k);
        for(int i=1; i<=n; i++)
        {
            int sum1=0;
            for(int j=1; j<=n; j++)
            {
                scanf("%d", &x);
                if(x==1)
                    sum1++;
            }
            num[i]=sum1;
        }
        double ans=0;
        for(int i=1; i<=n; i++)
        {
            if(num[i]>=k)
            {
                ans+=solve(num[i],k);
            }
        }
        printf("%.3lf\n", ans);
    }

    return 0;
}
时间: 2024-10-03 17:27:13

2015轻院校赛 D 社交网络(排列组合)的相关文章

2015轻院校赛 B 迷宫 (bfs)

http://acm.zznu.edu.cn/problem.php?id=1967 这套题的有毒   我交了好多遍才对 坑:机关要按照顺序走 并且在走这个机关之前不能走这个机关  但是能穿过这个机关   所以不能把机关刚开始设成墙 要设成其他符号 #include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #incl

第九届玲珑轻院校赛随笔

迎着小雨,我来到了翻车圣地---轻工业学院,我是来这几次翻几次,所以一开始心情就十分忐忑,开始的时候特别高大上,弄得跟省赛一样,还有个参赛证,不过因为意外,比赛推迟了一个小时,然后我们提前10分钟拿到了题目,因为是组队赛,所以与一开始我们分别看了三道题,,当他们两个讨论的时候,,我发现了,,以我的水平做不了分给我的那道题,然后我就在写生日party和烫饭那道题,我主要是自己单扣,生日party那道题模拟出来了但是卡常数,就TEL了,,然后就到中场吃东西时间啦,午餐很丰富,然后我就在饱腹感中AC了

【DFS+堆的二叉树结构】15轻院校赛-J-堆

[题目链接:J-堆] 1734: 堆 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 239  Solved: 113 SubmitStatusWeb Board Description Input Output Sample Input 3 1 10 3 10 5 3 1 2 1 3 5 1 2 3 4 5 3 1 2 1 2 4 2 5 Sample Output Yes No Yes [思路] 堆:堆最重要的性质就是儿子的值一定不小于父亲的值.

2016轻院校赛E作死报告

#include <stdio.h>int nums[1000005], judge[1000005];///nums数组表示从1900年到某年期间的闰年个数int days[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};void Init(){ for(int i=1900; i<=1000000; i

【二叉树、堆】15轻院校赛-J-堆

原题:http://acm.zzuli.edu.cn/problem.php?cid=1099&pid=9 [描述] [输入] [输出] Sample Input 3 1 10 3 10 5 3 1 2 1 3 5 1 2 3 4 5 3 1 2 1 2 4 2 5 Sample Output Yes No Yes [代码] 转自:http://www.cnblogs.com/chenchengxun/p/4443560.html 1 #include<stdio.h> 2 #incl

【程序员眼中的统计学(5)】排列组合:排序、排位、排

排列组合:排序.排位.排 作者 白宁超 2015年10月15日18:30:07 摘要:程序员眼中的统计学系列是作者和团队共同学习笔记的整理.首先提到统计学,很多人认为是经济学或者数学的专利,与计算机并没有交集.诚然在传统学科中,其在以上学科发挥作用很大.然而随着科学技术的发展和机器智能的普及,统计学在机器智能中的作用越来越重要.本系列统计学的学习基于<深入浅出统计学>一书(偏向代码实现,需要读者有一定基础,可以参见后面PPT学习).正如(吴军)先生在<数学之美>一书中阐述的,基于统

HDU--5396(区间dp+排列组合)

做这道题的时候,想到会不会是dp,然后发现dp可做,但是一直被自己坑到死. 枚举最后合并的那个位置,然后对于加减号的,分成的前后两个部分都有不同的组合方法, (a1+a2........) +  (b1,b2.............)         对于每个a,被加b的个数的阶乘次 ,对于每个b,被加a的个数的阶乘次 减法同理 乘法特殊一点 (a1+a2........) *  (b1,b2.............)  乘法分配率,直接将两部分的总和相乘即可 想到这些还远远没有结束,因为最

排列组合

(常考)错位排列 有N封信和N个信封,每封信都不装在自己信封里的排列种数记作Dn,则 D1=0,D2=1,D3=2,D4=9,D5=44,D6=265 一.相邻问题---捆绑法 不邻问题---插空法 对于某几个元素不相邻的排列问题,可先将其他元素排好,再将不相邻元素在已排好的元素之间及两端空隙中插入即可. [例题1]一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添进去2个新节目,有多少种安排方法? A.20 B.12 C.6 D.4 [答案]A. [解析] 以下内容需要回复才能看

hdu 1799 (循环多少次?)(排列组合公式)

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3051    Accepted Submission(s): 1117 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算