zoukankan      html  css  js  c++  java
  • HDU-1465-不容易系列之一(容斥)

    链接:

    https://vjudge.net/problem/HDU-1465

    题意:

    大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!
    做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总是比挣钱容易的道理一样。
    话虽这样说,我还是要告诉大家,要想失败到一定程度也是不容易的。比如,我高中的时候,就有一个神奇的女生,在英语考试的时候,竟然把40个单项选择题全部做错了!大家都学过概率论,应该知道出现这种情况的概率,所以至今我都觉得这是一件神奇的事情。如果套用一句经典的评语,我们可以这样总结:一个人做错一道选择题并不难,难的是全部做错,一个不对。

    不幸的是,这种小概率事件又发生了,而且就在我们身边:
    事情是这样的——HDU有个网名叫做8006的男性同学,结交网友无数,最近该同学玩起了浪漫,同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟!

    现在的问题是:请大家帮可怜的8006同学计算一下,一共有多少种可能的错误方式呢?

    思路:

    考虑所有装法有n!, 减去装对的装法。
    装对i个有C(n, i)*(n-i)!。可以优化式子,n!- n!/1!+n!/2!...

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<math.h>
    #include<vector>
    
    using namespace std;
    typedef long long LL;
    const int INF = 1e9;
    
    const int MAXN = 1e5+10;
    const int MOD = 1e9+7;
    
    LL F[30];
    
    void Init()
    {
        F[0] = F[1] = 1;
        for (int i = 1;i <= 20;i++)
            F[i] = F[i-1]*i;
    }
    
    int main()
    {
        Init();
        int n;
        while(~scanf("%d", &n))
        {
            LL res = F[n];
            LL tag = -1;
            for (int i = 1;i <= n;i++, tag = -tag)
                res = res+tag*F[n]/F[i];
            printf("%lld
    ", res);
        }
    
        return 0;
    }
    
  • 相关阅读:
    函数式编程
    高级特性
    ZooKeeper介绍
    perl 退出函数问题
    perl 处理 回车 换行符
    定义函数
    调用函数
    python 字典
    python 条件判断
    列表和数组
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11809018.html
Copyright © 2011-2022 走看看