题目链接:http://codeforces.com/gym/100952/problem/D

题目大意:n个礼物,m个人,要给m个人中的k个人买大于等于d的礼物,其他人随意,问你选择礼物的方案数(不是分配礼物的方案数)。

具体思路:一开始我的思路,先输出大于等于k的礼物的个数ans,然后再直接计算C(ans,k)*C(n-ans,m-k)就可以了。但是这样会出现重复计算的情况。比如说,4,5,6,7都满足情况,如果是按照我的思路的话,(4,5,6)和(4,6,5)是不同的,但是我们求的是选择礼物的方案数,不是分配数,所以这两个属于一个方案。然后就问了一下别人的思路,我们每一次选取t(t>=k)个满足大于d的值,然后剩下的从小于d的里面选,当t到达大于d的个数的时候,或者人数够了的时候停止,这样就能保证每一种方案里面,大于d的个数就肯定不同了。

感谢张明学长和lhk的精彩解释。

AC代码:

 #include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
# define ll long long
const int maxn =2e5+;
const int mod = 1e9+;
ll a[maxn];
ll tmp[maxn];
ll quickpow(ll t1,ll t2){
ll ans=;
while(t2){
if(t2&)ans=ans*t1%mod;
t2>>=;
t1=t1*t1%mod;
}
return ans;
}
ll C(ll n,ll r){
if(n==r||r==)return ;
tmp[]=;
for(ll i=;i<=r;i++){
tmp[i]=(tmp[i-]*(n-i+)%mod*quickpow(i,mod-))%mod;
}
return tmp[r]%mod;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
ll n,m,k,d;
scanf("%lld %lld %lld %lld",&n,&m,&k,&d);
ll ans=;
for(ll i=;i<=n;i++){
scanf("%lld",&a[i]);
if(a[i]>=d)ans++;
}
ll w=min(m,ans);//注意取min
ll tot=;
for(ll i=k;i<=w;i++){
tot+=C(ans,i)*C(n-ans,m-i)%mod;
tot%=mod;
}
printf("%lld\n",tot%mod);
}
return ;
}

D. Time to go back(思维)的更多相关文章

  1. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  2. Photoshop、Illustrator思维导图笔记

    半年前学习Photoshop时记得的思维导图笔记,可能不是很全,常用的基本都记下了.

  3. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  4. 计算机程序的思维逻辑 (8) - char的真正含义

    看似简单的char 通过前两节,我们应该对字符和文本的编码和乱码有了一个清晰的认识,但前两节都是与编程语言无关的,我们还是不知道怎么在程序中处理字符和文本. 本节讨论在Java中进行字符处理的基础 - ...

  5. 计算机程序的思维逻辑 (29) - 剖析String

    上节介绍了单个字符的封装类Character,本节介绍字符串类.字符串操作大概是计算机程序中最常见的操作了,Java中表示字符串的类是String,本节就来详细介绍String. 字符串的基本使用是比 ...

  6. 计算机程序的思维逻辑 (31) - 剖析Arrays

    数组是存储多个同类型元素的基本数据结构,数组中的元素在内存连续存放,可以通过数组下标直接定位任意元素,相比我们在后续章节介绍的其他容器,效率非常高. 数组操作是计算机程序中的常见基本操作,Java中有 ...

  7. 计算机程序的思维逻辑 (33) - Joda-Time

    Joda-Time上节介绍了JDK API中的日期和时间类,我们提到了JDK API的一些不足,并提到,实践中有一个广泛使用的日期和时间类库,Joda-Time,本节我们就来介绍Joda-Time.俗 ...

  8. 计算机程序的思维逻辑 (53) - 剖析Collections - 算法

    之前几节介绍了各种具体容器类和抽象容器类,上节我们提到,Java中有一个类Collections,提供了很多针对容器接口的通用功能,这些功能都是以静态方法的方式提供的. 都有哪些功能呢?大概可以分为两 ...

  9. 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式

    在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...

  10. "Becoming Functional" 阅读笔记+思维导图

    <Becoming Functional>是O'Reilly公司今年(2014)7月发布的一本薄薄的小册子,151页,介绍了函数式编程的基本概念.全书使用代码范例都是基于JVM的编程语言, ...

随机推荐

  1. c#线程1

    开启一个线程的方式: 方式一:Thread t1 = new Thread(Method_1); t1.Start();方式二:委托 Action ac = Method_1; ac.BeginInv ...

  2. saltstack SLS

    SLS文件定义 SLS(代表SaLt State文件)是Salt State系统的核心.SLS描述了系统的目标状态,由格式简单的数据构成.这经常被称作配置管理 top.sls 是配置管理的入口文件,一 ...

  3. nGrinder TestRunnerInsertMysqlSingle.groovy

    s C:\Users\Lindows\workspace\GroovyTest\src\com\iteye\lindows\mysql\TestRunnerInsertMysqlSingle.groo ...

  4. 【openssl】利用openssl完成X509证书和PFX证书之间的互转

    利用openssl完成X509证书和PFX证书之间的互转 # OpenSSL的下载与安装: 1.下载地址: 官方网址—— https://www.openssl.org/source/ OpenSSL ...

  5. JAVA核心技术I---JAVA基础知识(内部类)

    一:内部类概述 (一)定义 内部类(Inner Class)是定义在其他类中或方法中的类,包含内部类的类通常称作Enclosing Class 内部类的功能通常与包含它的类的功能有紧密的关联 内部类的 ...

  6. [leetcode-108,109] 将有序数组转换为二叉搜索树

    109. 有序链表转换二叉搜索树 Given a singly linked list where elements are sorted in ascending order, convert it ...

  7. Docker 从入门到放弃(四)Docker+Jenkins_自动化持续集成

    Windows 查看密码 $ cat /var/jenkins_home/secrets/initialAdminPassword 14e14c414f41481aa5955753d3f31f9f 自 ...

  8. Subversion Edge部署

    1.配置java的jdk vim /etc/profile 上面文件中加入export JAVA_HOME=/****/jdk*****,然后在path中加入$JAVA_HOME/bin:  ,保存退 ...

  9. 分布式配置 SSH 免密登陆

    原地址忘记了,暂且记下 一.准备工作 1) 用客户端工具(ssh client或者putty)连接到linux服务器.在root用户下输入命令 vi /etc/hosts,用vi编辑hosts文件,如 ...

  10. 细说tomcat之类加载器

    官网:http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.htmlJava类加载与Tomcat类加载器层级关系对比 Java Clas ...