题目地址

在WFU(不是大学简称)第二次比赛中做到了这道题。高中阶段参加过数竞的同学手算这样的题简直不能更轻松,只是套一个容斥原理公式就可以。而其实这个过程放到编程语言中来实现也没有那么的复杂,不过为了让计算机在限定的时间内完成计算需要进行一些对计算上的优化。模MOD的情况下计算组合数nCr只需要求出分子再乘以分母的逆元,考虑到模的是1e9+7本身就是一个质数,根据费马小定理a^(MOD-2)即是a在模MOD意义下的逆元。求逆元的时候为了节约计算时间可以采用快速幂。计算过程就是容斥原理,就没有什么好说的了。

参考代码

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=(int)1e9+;
ll f[],fact[];
ll fast_exp(ll base,ll exp,ll mod)
{
ll res=;
while(exp)
{
if(exp&)
res=res*base%mod;
base=base*base%mod;
exp>>=;
}
return res;
}
ll inverse_mod(ll x,ll mod)
{
return fast_exp(x,mod-,mod);
}
ll nCr(ll n,ll r)
{
if(n<r)
return ;
r=min(r,n-r);
ll ret=;
for(ll x=n;x>n-r;x--)
{
ret=(ret*(x%MOD))%MOD;
}
ret=(ret*inverse_mod(fact[r],MOD))%MOD;
return ret;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n,i,j,N,cnt;
ll s,temp,ans=;
fact[]=;
for(i=;i<;i++)
fact[i]=(fact[i-]*i)%MOD;
cin>>n>>s;
for(i=;i<n;i++)
cin>>f[i];
N=<<n;
for(i=;i<N;i++)
{
temp=,cnt=;
for(j=;j<n;j++)
{
if(i&(<<j))
{
temp+=(f[j]+);cnt++;
}
}
if(temp>s)
continue;
ll x=nCr(s-temp+n-,n-);
if(cnt%!=)
x*=(-);
ans=(ans+x+MOD)%MOD;
}
cout<<ans<<"\n";
return ;
}

果然计算机和数学联系还是十分密切,当初搞数竞的时候觉得那些奇技淫巧恐怕难觅用武之地,结果现在才发现这些原来在编程中有很大的应用……眼前又是新的挑战,无论如何都不想再经历像高三那一年一样的绝望了吧……那么,加油吧,就像曾经一样,付出你的全部热情。不论你还相不相信你还可以成功,这都是可能使你回到巅峰的唯一途径了。让苦难成为力量。

Codeforces 451E Devu and Flowers(组合计数)的更多相关文章

  1. Codeforces 451E Devu and Flowers(容斥原理)

    题目链接:Codeforces 451E Devu and Flowers 题目大意:有n个花坛.要选s支花,每一个花坛有f[i]支花.同一个花坛的花颜色同样,不同花坛的花颜色不同,问说能够有多少种组 ...

  2. Codeforces 451E Devu and Flowers【容斥原理+卢卡斯定理】

    题意:每个箱子里有\( f[i] \)种颜色相同的花,现在要取出\( s \)朵花,问一共有多少种颜色组合 首先枚举\( 2^n \)种不满足条件的情况,对于一个不被满足的盒子,我们至少拿出\( f[ ...

  3. codeforces 451E Devu and Flowers

    题意:有n个瓶子每个瓶子有 f[i] 支相同的颜色的花(不同瓶子颜色不同,相同瓶子花视为相同) 问要取出s支花有多少种不同方案. 思路: 如果每个瓶子的花有无穷多.那么这个问题可以转化为  s支花分到 ...

  4. codeforces 451E. Devu and Flowers 容斥原理+lucas

    题目链接 给n个盒子, 每个盒子里面有f[i]个小球, 然后一共可以取sum个小球.问有多少种取法, 同一个盒子里的小球相同, 不同盒子的不同. 首先我们知道, n个盒子放sum个小球的方式一共有C( ...

  5. CodeForces - 451E Devu and Flowers (容斥+卢卡斯)

    题意:有N个盒子,每个盒子里有fi 朵花,求从这N个盒子中取s朵花的方案数.两种方法不同当且仅当两种方案里至少有一个盒子取出的花的数目不同. 分析:对 有k个盒子取出的数目超过了其中的花朵数,那么此时 ...

  6. Codeforces 932E Team work 【组合计数+斯特林数】

    Codeforces 932E Team work You have a team of N people. For a particular task, you can pick any non-e ...

  7. CF 451E Devu and Flowers

    可重集的排列数 + 容斥原理 对于 \(\{A_1 * C_1, A _2 * C_2, \cdots, A_n * C_n\}\)这样的集合来说, 设 \(N = \sum_{i = 1} ^ n ...

  8. codeforces 691F F. Couple Cover(组合计数)

    题目链接: F. Couple Cover time limit per test 3 seconds memory limit per test 512 megabytes input standa ...

  9. Codeforces Round #258 (Div. 2) E. Devu and Flowers 容斥

    E. Devu and Flowers 题目连接: http://codeforces.com/contest/451/problem/E Description Devu wants to deco ...

随机推荐

  1. Java连接Redis (key-value存储系统)

    Redis简介: redis是一个性能非常优秀的内存数据库,通过key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表). ...

  2. javascript的类、委托、事件

    javascript中的类: javascript中的类 );         p2.show();                  //注:Javascript中没有真正的方法重载 看起来很简单吧 ...

  3. iphone和ipad各控件大小

    ipad和iphone是一样的:

  4. Ninject简介

    1.为什么要用Ninject? Ninject是一个IOC容器用来解决程序中组件的耦合问题,它的目的在于做到最少配置.其他的的IOC工具过于依赖配置文件,需要使用assembly-qualified名 ...

  5. spring环境搭建需要的插件-------Spring Tool Suite™ Downloads

    下载地址http://spring.io/tools/sts/all 上面的是集成了eclipse的,所以文件比较大,下面的是单独的插件,下载之后打开eclipse,help->installN ...

  6. JavaScript高级应用(一)

    1.尺寸 //各种尺寸 s += "\r\n网页可见区域宽(document.body.clientWidth):"+ document.body.clientWidth; s + ...

  7. Android安全研究经验谈

    安全研究做什么 从攻击角度举例,可以是:对某个模块进行漏洞挖掘的方法,对某个漏洞进行利用的技术,通过逆向工程破解程序.解密数据,对系统或应用进行感染.劫持等破坏安全性的攻击技术等. 而防御上则是:查杀 ...

  8. 不用安装Oracle_Client就能使用PLSQL_Developer

    1. 下载oracle的客户端程序包(30M)       只需要在Oracle官方网站下载一个叫Instant Client Package的软件就可以了,这个软件不需要安装,只要解压就可以用了,很 ...

  9. 关于Youtube URL的十个技巧

    你一定很熟悉Youtube了,知道它是一个视频分享网站.是的,youtube目前十分流行,你也许会常常访问.这里有一些关于youtube url的技巧,了解了这些技巧,你就可以更好的利用youtube ...

  10. Ubuntu 16.04 + Caffe

    主要参考: https://github.com/BVLC/caffe/wiki/Ubuntu-16.04-or-15.10-Installation-Guide http://caffe.berke ...