hdu 4390 容斥组合数学

原创 2016年08月30日 15:04:43

先抽象出 n个相同物品放在m个不同抽屉里的模型 结果为C(n, n+m-1)
然后本题要求抽屉里必须放物品 所以要反向思维容斥求出有抽屉不放物品的方案数
为大于等于一个为空的方案减大于等于两个为空的方案加大于等于三个为空的方案。。。。

#include<cstdio>
#include<cstring>
#include<vector>
#define LL long long
using namespace std;
#define maxn 1000005
#define mod 1000000007ll
int am[maxn], n, ans[100];
LL c[1005][1005];
int main()
{
    for(int i = 0; i<= 1004; i++)
        for(int j = 0; j<= i; j++)
        {
            if(j == 0 || j == i) c[i][j] = 1;
            else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
        }
    while(scanf("%d", &n)!=EOF)
    {
        vector<int>ve;
        memset(am, 0, sizeof(am));
        for(int i = 0; i < n; i++)
        {
            int tmp;
            scanf("%d", &tmp);
            for(int j = 2; j * j <= tmp; j++)
                while(tmp % j == 0)
                {
                    tmp /= j;
                    am[j]++;
                }
            am[tmp]++;
        }
        for(int i = 2; i < maxn ; i++) if(am[i]) ve.push_back(am[i]);
        LL ans1 = 1;
        for(int i = 0; i < ve.size(); i++)
        {
            ans1 *= c[n + ve[i] - 1][ve[i]];
            ans1 %= mod;
        }
        LL ans2 = 0;
        for(int i = 1; i <= n; i++)
        {
              LL tmp = c[n][i];
              for(int j = 0; j < ve.size(); j++)
              {
                 tmp *= c[n + ve[j] - 1 - i][ve[j]];
                 tmp %= mod;
              }
              if(i & 1)ans2 += tmp;
              else ans2 -= tmp;
              ans2 = (ans2 + mod) % mod;
        }
        printf("%I64d\n", (ans1 - ans2 + mod) % mod);
    }
    return 0;
}

【HDU】5155 Harry And Magic Box 【容斥原理】

传送门:【HDU】5155 Harry And Magic Box 题目分析:很容易发现容斥的方法,首先我们不管是否每一列都有星星,但是一定保证每一行至少一个星星,因此我们得到了一个方法,这...
  • u013368721
  • u013368721
  • 2015年01月03日 22:02
  • 1262

HDU 2204 Eddy's 爱好(容斥原理、给定n求满足p=m^k <= n的p的个数)

题目链接: HDU 2204 Eddy’s 爱好 题意; 给一个nn,在p∈[1,n]p\in [1, n]范围满足mk=p(m≥1,k>1m^k=p(m \geq 1, k > 1的数字pp的...
  • Ramay7
  • Ramay7
  • 2016年07月14日 13:52
  • 390

!HDU 4135 Co-prime-容斥原理-(位运算技巧)

题意:求区间 [a~b]内与n互素的数的个数 分析: 容斥原理很容易想到,关键在于怎么实现。 有三种方法:dfs、队列数组、位运算。我觉得位运算比较好理解。先求出n的质因数设有cnt个,则这cnt个数...
  • AC_0_summer
  • AC_0_summer
  • 2015年07月21日 22:24
  • 610

HDU1695 GCD【容斥原理】【欧拉函数】

题目大意: 给你5个整数a、b、c、d、k,在区间[a,b]中选一个数x,在区间[c,d]中选一个数y,使得x和y的 公约数为k,即gcd(x,y) = k。现在问题来了:这样的整数对共有多少对。 ...
  • u011676797
  • u011676797
  • 2015年03月26日 22:57
  • 779

hdu 4390 容斥

题意可以理解为有k种数,每个都ki个,把这k个数放到n个容器里,保证这n个容器里没有空的。 设f[i]为i个容器里没有空的,g[i]为i个容器里可以为空。 则g[n] = f[n] - c(n,1...
  • zstu_zy
  • zstu_zy
  • 2016年10月22日 14:29
  • 92

HDU3929(容斥原理)

题目:Big Coefficients   题意:F(x) = (1+x)^a1 + (1+x)^a2 + ... + (1+x)^am,求系数是奇数的项的个数。 容斥原理:递归形式 dfs(...
  • ACdreamers
  • ACdreamers
  • 2013年07月09日 13:02
  • 1440

HDU 5201 The Monkey King (容斥 经典题)

HDU 5201 The Monkey King (容斥 经典题)
  • Tc_To_Top
  • Tc_To_Top
  • 2015年09月19日 21:21
  • 984

HDU 5852:Intersection is not allowed!(行列式+逆元求组合数)

Description      有K个棋子在一个大小为N×N的棋盘。一开始,它们都在棋盘的顶端,它们起始的位置是 (1,a1),(1,a2),...,(1,ak) ,它们的目的地是 (n,...
  • qq_35649707
  • qq_35649707
  • 2017年03月28日 19:19
  • 225

hdu 6143 Killer Names 容斥||第二类斯特林数

http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意:有m种字符,要求构造两段长度为n的字符串,其中这两段不能有相同的字符 枚举左边选了i种字符,右边...
  • jerans
  • jerans
  • 2017年08月17日 20:42
  • 232

hdu 4390 隔板+容斥

Given a number sequence b 1,b 2…b n. Please count how many number sequences a 1,a 2,…,a n satisfy ...
  • Littlewhite520
  • Littlewhite520
  • 2017年07月19日 15:16
  • 207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4390 容斥组合数学
举报原因:
原因补充:

(最多只允许输入30个字)