Code Festival 2017 Qual B E Popping Balls
传送门
神仙计数!
我的计数真的好差啊= =
不过这个题真的神仙
看了题解把整个过程在草稿纸上重写了一遍才想明白= =(一张草稿纸就没有了!!!)
计数的关键就是在于 枚举的有效性和独立性【不能重复计数】
然后我们就来思考一下这个题
1. 确定t
我们重定义t为第一个取出的蓝球的位置
那么t的选择区间是[1,a+1] 分别对应[a+1,1]的时候取出
枚举区间:[1,a+1]
2.枚举i
取走前面的 a+1-t个 红球 和 在位置t的 1个 蓝球(根据第一步的定义)
这个时候总共取出了 a-t+2个 球 还没有取的有 b-1个 蓝球 和 t-1个 红球
我们发现现在红球和蓝球可以任意排列 因为t所在的位置开始全部都是蓝球 而1开始全部都是红球
这样计数不会重复因为最开始枚举的t保证了前面取出的已经不同
此时我们枚举i表示取走的蓝球数量
我们的可以任取几个球呢? 答案是 b-1个 因为t所在的位置在球数<t的时候就失效了 所以 b+t-2-(t-1)=b-1
所以i的枚举区间是[0,b-1]
这时候的贡献 : C(i,b-1)
考虑现在剩下的球的个数 有 t-1-i个 红球 和 i个蓝球
3.确定s
这时候我们的t已经失效了 并且已知了前面的互不相同的序列
s的枚举范围与t类似 这个时候s表示现在开始第一个取蓝球的位置
和第一步同理 表示先取 t-i-s个 红球再取 1个 蓝球
枚举区间:[1,t-i]
4.枚举j
考虑此时剩下了 s-1个 红球 和 i-1个 蓝球
此时位置s开始全是蓝球 1位置全是红球 又可以任选啦=v=
我们考虑枚举j表示 取出 j个 红球 和 i-1-j个 蓝球
这个的贡献就是:C(j,i-1)
枚举区间对应的是[0,min(s-1,i-1)]
于是我们现在按照这个做得到了一个的枚举大法
接着考虑优化 首先j一定是可以对应一个前缀和的当然就是f[i-1][s-1]
s的枚举也是可以用前缀和优化掉的 就是对f进行前缀和得到sum[i-1][t-i-1](注意细节i可以取到0所以要每次枚举t的时候++)
然后这样的话我们就得到了一个非常优秀的做法
这样就是可以通过的啦=v=
完结撒花~
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 20021225
#define ll long long
#define N 2000
#define mdn 1000000007
using namespace std;
int f[N+10][N+10],sum[N+10][N+10],C[N+10][N+10];
void prework()
{
C[0][0]=C[1][0]=C[1][1]=1;
//f[0][0]=sum[0][0]=1;
for(int i=2;i<=N+1;i++)
{
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mdn;
}
for(int i=0;i<=N+1;i++)
{
f[i][0] = C[i][0];
for(int j=1;j<=N+1;j++)
f[i][j] = (f[i][j-1] + C[i][j])%mdn;
}
for(int i=0;i<=N+1;i++)
{
sum[i][0] = f[i][0];
for(int j=1;j<=N+1;j++)
sum[i][j]=(sum[i][j-1] + f[i][j])%mdn;
}
}
int a,b;
void work()
{
int ans=0;
prework();
for(int t=1;t<=a+1;t++)
{
ans++;
for(int i=1;i<=min(t-1,b-1);i++)
{
ans += (ll)C[b-1][i]*sum[i-1][t-i-1]%mdn;
ans %= mdn;
}
}
printf("%d\n",ans);
}
int main()
{
scanf("%d%d",&a,&b);
work();
return 0;
}
Code Festival 2017 Qual B E Popping Balls的更多相关文章
- Atcoder CODE FESTIVAL 2017 qual B E - Popping Balls 组合计数
题目链接 题意 \(A+B\)个球排成一行,左边\(A\)个为红球,右边\(B\)个为蓝球. 最开始可以选择两个数\(s,t\),每次操作可以取左起第\(1\)或\(s\)或\(t\)个球.问有多少种 ...
- CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】
CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...
- CODE FESTIVAL 2017 qual B C - 3 Steps【二分图】
CODE FESTIVAL 2017 qual B C - 3 Steps 题意:给定一个n个结点m条边的无向图,若两点间走三步可以到,那么两点间可以直接连一条边,已经有边的不能连,问一共最多能连多少 ...
- 【AtCoder】CODE FESTIVAL 2017 qual B
最近不知道为啥被安利了饥荒,但是不能再玩物丧志了,不能颓了 饥荒真好玩 A - XXFESTIVAL CCFESTIVAL #include <bits/stdc++.h> #define ...
- CODE FESTIVAL 2017 qual B 题解
失踪人口回归.撒花\^o^/ 说来真是惭愧,NOI之后就没怎么刷过题,就写了几道集训队作业题,打了几场比赛还烂的不行,atcoder至今是蓝名=.= 以后还是多更一些博客吧,我可不想清华集训的时候就退 ...
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
蒟蒻__stdcall终于更新博客辣~ 一下午+一晚上=一道计数题QAQ 为什么计数题都这么玄学啊QAQ Prelude 题目链接:这里是传送门= ̄ω ̄= 下面我将分几个步骤讲一下这个题的做法,大家不 ...
- CODE FESTIVAL 2017 qual B
昨晚因为有点事就去忙了,没打后悔啊 A - XXFESTIVAL Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem ...
- Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分
题目链接 题意 给定一个字符串(长度\(\leq 2e5\)),将其划分成尽量少的段,使得每段内重新排列后可以成为一个回文串. 题解 分析 每段内重新排列后是一个回文串\(\rightarrow\)该 ...
- Atcoder CODE FESTIVAL 2017 qual C C - Inserting 'x' 回文串
题目链接 题意 给定字符串\(s\),可以在其中任意位置插入字符\(x\). 问能否得到一个回文串,若能,需插入多少个\(x\). 思路 首先统计出现次数为奇数的字符\(cnt\). \(cnt\ge ...
随机推荐
- 做网站用php还是python
单纯说做网站,显然是php更适合,php是专为web而生,而Python只是可以做web.php也比python更简单,更容易学,对于新手更友好. 从权威技术网站w3techs.com2017年7月2 ...
- 简易的Web自动化链接测试(Xenu)
1.理解链接需要测试的测试点: [1] 要测试的链接页面是否存在 [2] 确定存在链接页面,然后就考虑跳转后的页面是不是对应需求的页面[3] 保证Web系统上没有孤立的页面(没有链接指向该页面) 2. ...
- SSL异常javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
jdk 7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html jdk 8 http: ...
- thinkphp 级联菜单实现
养殖场->栋舍级联菜单 //获取默认养殖场和栋舍信息 public function sbjr(){ $yzc_model=M("Yzc"); $list = $yzc_mo ...
- HTTP和HTTPS协议,详解
大纲 一.前言: 先来观察这两张图,第一张访问域名http://www.12306.cn,谷歌浏览器提示不安全链接,第二张是https://kyfw.12306.cn/otn/regist/init, ...
- vue.js + element 搭建后台管理系统 笔记(一)
此文仅记录本人在搭建后台系统过程中遇到的难点及注意点,如果能帮到各位自然是极好的~~~ 项目主要架构:vueJS.elementUI.scss 一.项目初始化 首先需要安装nodejs,安装方法就不在 ...
- JSP中四种属性保存范围(1)
一.四种属性范围 在JSP中提供了四种属性保存范围 page:在一个页面内保存属性,跳转之后无效request:在一次服务请求范围内,服务器跳转后依然有效session:-在一次会话范围内,无论何种跳 ...
- java数组,遍历数组
数组:一组具有相同数据类型的集合(容器) 1.数组声明格式: 数据类型 [] 数组名 = new 数据类型[长度]: 数组长度一旦确定无法更改. 数组里的数据必须是相同类型或自动向上转型后兼容的类型 ...
- Python笔记(二十)_多态、组合
多态 对于函数中的变量,我们只需要知道它这个变量是什么类,无需确切地知道它的子类型,就可以放心地调用类的方法,而具体调用的这个方法是作用在父类对象还是子类对象上,由运行时该对象的确切类型决定,这就是多 ...
- Python笔记(十三)_os模块和os.path模块
os模块中关于文件/目录常用的函数使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名('.'表示当前目录,' ...