HDU 4159 Indomie ( 组合数学 )

HDU 4159 Indomie ( 组合数学 )

#include <cstdio>
typedef __int64 LL;
#define MAXN 101
int n, s;
LL po[ MAXN ];

void init()
{
    po[0] = 1;
    for( int i = 1; i < MAXN; ++i )
        po[i] = po[i-1] * 2;
}

double CC( int n, int m )
{
    double res = 1;
    for( int i = 0; i < m; ++i )
        res *= (double)(n-i) / (i+1);
    return res;
}

int main()
{
    init();
    while( ~scanf( "%d %d", &n, &s ) )
    {
        if( s == 0 )        puts( "0.00000");
        else if( s > n )    puts( "100.00000");
        else
        {
            double res1 = 0, res2 = 0;
            for( int i = 0 ; i <= s; ++i )
            {
                res1 += CC( n, i )* po[n-i];
                if( i == s - 1 )
                    res2 = res1;
            }
            printf( "%.5lf\n", 100.0 * res2 / res1 );
        }

    }
}

代码君

时间: 2024-08-01 10:45:31

HDU 4159 Indomie ( 组合数学 )的相关文章

百度之星2017 HDU 6114 Chess 组合数学

Chess 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6114 Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車--他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻击的方案数.他经过思考,得出了答案.但他仍不满足,想增加一个条件:对于任何一个車A,如果有其他一个車B在它的上方(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B).现在要问问

hdu 1220 Cube (组合数学)

/* 给你一个边长n的正方体,切割成n*n*n个单位体积的小正方体,求所有公共顶点数<=2的小正方体的对数. 公共点的数目可能有:0,1,2,4. 我们用总的对数减掉有四个公共点的对数就可以了. 总的对数:n^3*(n^3-1)/2(一共有n^3块小方块,从中选出2块) 而4个交点的立方体对是两个立方体共面的情况, 所以我们只要求出大的立方体一共有多少个单位面积的公共面就可以了, 既所有单位立方体的面数6*n^3减去在大立方体表面的面数6*n^2就可以了,, 所以结果为:n^3 * (n^3-1

HDU 5159 Card (组合数学)

所有的组合中包含某个数的次数对于所有的数来说是相同的,那么就求出这个次数乘以所有数的和然后除以总的组合次数就可以了.开始想复杂了... 可以先预处理下,然后直接输出. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <

hdu 4869 Turn the pokers(递推&amp;组合数学&amp;逆元)

Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1279    Accepted Submission(s): 466 Problem Description During summer vacation,Alice stay at home for a long time, with nothing t

hdu(2062)-Subset sequence 组合数学

题意:求集合{1,2,3...n}的第m个排列子集合.集合的大小按字典树排. 例两个元素的排列子集合按字典树排列是:{1},{1,2},{2},{2,1}: 解法:一个一个元素来确定,每次把剩余的元素按大小顺序排列在num中,然后根据排列组合原理直接计算下一个位置的元素的大小,直到排列数为0停止: 代码: /****************************************************** * author:xiefubao **********************

HDU 4908 BestCoder Sequence(组合数学)

HDU 4908 BestCoder Sequence 题目链接 题意:给定一个序列,1-n的数字,选定一个作为中位数m,要求有多少连续子序列满足中位数是m 思路:组合数学,记录下m左边和右边一共有多少种情况大于m的数字和小于n数组的差,然后等于左边乘右边所有的和,然后最后记得加上左右两边差为0的情况. 当时也是比较逗,还用树状数组去搞了,其实完全没必要 代码: #include <cstdio> #include <cstring> #define lowbit(x) (x&am

HDU 4909 String(组合数学)

HDU 4909 String 题目链接 题意:给定一个字符串全是小写字符,可能有一个位置为?,问号可以替代任何字符,也可以删掉,问有多少连续字串满足所有字母是偶数个 思路:组合数学,计算所有前最串的各个字母的奇偶状态,用一个01串表示,然后记录下个数,对于每个相同的状态,任选两个就能得到一个子序列,答案为所有C(num, 2)的和. 但是这个问题多了一个?的情况,但是没关系,可以枚举?,然后把序列分为3部分去考虑,?之前,?之后,和包含了?的串分开考虑即可 代码: #include <cstd

HDU 1695 GCD (数论-整数和素数,组合数学-容斥原理)

GCD Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're only required to output t

hdu 3037 Saving Beans(组合数学)

hdu 3037 Saving Beans 题目大意:n个数,和不大于m的情况,结果模掉p,p保证为素数. 解题思路:隔板法,C(nn+m)多选的一块保证了n个数的和小于等于m.可是n,m非常大,所以用到Lucas定理. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; ll n, m, p; ll qPow (ll a