码迷,mamicode.com
首页 > 其他好文 > 详细

XDOJ_1149_容斥原理

时间:2016-11-01 01:27:00      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:for   power   inline   dia   scanf   include   阶乘   acm   break   

http://acm.xidian.edu.cn/problem.php?id=1149

 

真的厉害,虽然不知道这原理怎么证明的,预处理阶乘和逆元。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MOD (long long)(1e9+7)
#define LL long long
using namespace std;

LL fac[2000005],inv[2000005],n,m,k;

LL PowerMod(LL a, LL b, LL c)
{
    LL ans = 1;
    a = a % c;
    while(b)
    {
        if(b&1) ans = (ans*a)%c;
        b = b>>1;
        a = (a*a)%c;
    }
    return ans;
}

inline LL c(LL n,LL m)
{
    if(m > n)   return 0;
    return fac[n]*inv[m]%MOD*inv[n-m]%MOD;
}

int main()
{
    fac[0] = 1;
    for(int i = 1;i <= 2000000;i++) fac[i] = fac[i-1]*i%MOD;
    inv[2000000] = PowerMod(fac[2000000],MOD-2,MOD);
    for(int i = 1999999;i >= 0;i--) inv[i] = inv[i+1]*(i+1)%MOD;
    while(~scanf("%lld%lld%lld",&n,&m,&k))
    {
        LL ans = c(n+m-1,m),x = -1;
        for(int i = 1;i <= n;i++,x = -x)
        {
            LL t = m-i*(k+1);
            if(t < 0)   break;
            ans = (ans+x*(c(n,i)*c(n+t-1,t)%MOD)+MOD)%MOD;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

XDOJ_1149_容斥原理

标签:for   power   inline   dia   scanf   include   阶乘   acm   break   

原文地址:http://www.cnblogs.com/zhurb/p/6017929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!