Codeforces 451E Devu and Flowers(组合计数)
在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(组合计数)的更多相关文章
- Codeforces 451E Devu and Flowers(容斥原理)
		
题目链接:Codeforces 451E Devu and Flowers 题目大意:有n个花坛.要选s支花,每一个花坛有f[i]支花.同一个花坛的花颜色同样,不同花坛的花颜色不同,问说能够有多少种组 ...
 - Codeforces 451E Devu and Flowers【容斥原理+卢卡斯定理】
		
题意:每个箱子里有\( f[i] \)种颜色相同的花,现在要取出\( s \)朵花,问一共有多少种颜色组合 首先枚举\( 2^n \)种不满足条件的情况,对于一个不被满足的盒子,我们至少拿出\( f[ ...
 - codeforces  451E  Devu and Flowers
		
题意:有n个瓶子每个瓶子有 f[i] 支相同的颜色的花(不同瓶子颜色不同,相同瓶子花视为相同) 问要取出s支花有多少种不同方案. 思路: 如果每个瓶子的花有无穷多.那么这个问题可以转化为 s支花分到 ...
 - codeforces 451E. Devu and Flowers  容斥原理+lucas
		
题目链接 给n个盒子, 每个盒子里面有f[i]个小球, 然后一共可以取sum个小球.问有多少种取法, 同一个盒子里的小球相同, 不同盒子的不同. 首先我们知道, n个盒子放sum个小球的方式一共有C( ...
 - CodeForces - 451E Devu and Flowers (容斥+卢卡斯)
		
题意:有N个盒子,每个盒子里有fi 朵花,求从这N个盒子中取s朵花的方案数.两种方法不同当且仅当两种方案里至少有一个盒子取出的花的数目不同. 分析:对 有k个盒子取出的数目超过了其中的花朵数,那么此时 ...
 - 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 ...
 - CF 451E  Devu and Flowers
		
可重集的排列数 + 容斥原理 对于 \(\{A_1 * C_1, A _2 * C_2, \cdots, A_n * C_n\}\)这样的集合来说, 设 \(N = \sum_{i = 1} ^ n ...
 - codeforces 691F F. Couple Cover(组合计数)
		
题目链接: F. Couple Cover time limit per test 3 seconds memory limit per test 512 megabytes input standa ...
 - 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 ...
 
随机推荐
- JS中反斜杠和单双引号的配合使用效果
			
<div id="tag"></div> <div id="tag1"></div> <div id=&q ...
 - POJ - 1978 Hanafuda Shuffle
			
最初给牌编号时,编号的顺序是从下到上:洗牌时,认牌的顺序是从上到下.注意使用循环是尽量统一“i”的初始化值,都为“0”或者都为“1”,限界条件统一使用“<”或者“<=”. POJ - 19 ...
 - Make Blog Beautiful
			
想做一个文艺而专业的编程技术博客 :) 博客定位 编程大观园,正如其名,探索和汇萃各种编程思想.技术.技能.技巧,并融入自己对编程开发.产品研发的思考和探索. 分类与标签 好的博客分类能让访 ...
 - 配置DNS服务器
			
一.配置基本的DNS 服务器(包含正向解析和反向解析)域名:abc.com服务器IP:10.1.2.11 1. 编辑主配置文件/etc/named.conf---------------------- ...
 - python :页面布局 ,后台管理页面之左侧菜单跟着滚动条动
			
左侧菜单跟着滚动条动 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:// ...
 - [Python]实现XMPP协议即时通讯发送消息功能
			
#-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = 'che ...
 - 【Spring】Junit加载Spring容器作单元测试
			
如果我们需要对我们的Service方法作单元测试,恰好又是用Spring作为IOC容器的,我们可以这么配置Junit加载Spring容器,方便做单元测试. > 基本的搭建 (1)引入所需的包 & ...
 - 【OOAD】面向对象设计原则概述
			
软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity)  ...
 - 深入浅出设计模式——享元模式(Flyweight Pattern)
			
模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...
 - iOS - Mac OS X 终端设置
			
Mac OS X 终端设置 1)Finder 中显示资源库 方法一: 在 "终端" 中输入下面的命令: 显示: chflags nohidden ~/Library/ 隐藏: ch ...