做这题之前先看道高考真题(好像是真题,我记不清了)

例:已知一个由n个0和n个1排列而成的数列,要求对于任意k∈N*且k∈[1,2n],在前k个数中1的个数不少于0的个数,求当n=4时这样的数列的数量。

解:14个(策略:暴力枚举,时间复杂度O(2^n))

所以本题其实就是对高考真题的一个一般化推广,首先扩大了n的范围,而且0的个数和1的个数可能不等了,所以这道题并不简单

我们通过打表可以发现:当n=m时,答案满足卡特兰数列,即

当n!=m呢?

再稍微打个表,答案就是

(我不会告诉你我没打出来这个表的)

接下来就好说了,预处理阶乘逆元然后计算组合数即可

但是为什么是这个公式呢?

我们稍微转化一下:将问题放到坐标系上,假设1代表向右上走,0代表向右下走,那么问题转化为了从(0,0)点到(n+m,n-m)点且不经过第四象限的方案数

那么如果完全统计方案数,答案即为

但是一定有一些是不合法的啊

那么如果是不合法的方案,这些不合法的路径一定会经过直线y=-1,那么我们将经过这条直线之前的所有点关于这条直线对称,会发现起点变成了(0,-2)!

于是问题转化为了从(0,-2)走到(n+m,n-m)的方案数

设向上走x步,向下走y步

则x+y=n+m,x-y=n-m+2

∴x=n+1,y=m-1

∴方案数即为

两者做差即可

解释如图。

当然,这题还有一些递推式,比如f[i][j]=f[i-1][j]+f[i][j-1],若i<j f[i][j]=0

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <stack>
  9. #define ll long long
  10. #define mode 20100403
  11. using namespace std;
  12. ll inv[];
  13. ll mul[];
  14. ll n,m;
  15. void init()
  16. {
  17. inv[]=inv[]=;
  18. for(int i=;i<=n+m;i++)
  19. {
  20. inv[i]=(mode-mode/i)*inv[mode%i]%mode;
  21. }
  22. mul[]=mul[]=;
  23. for(int i=;i<=n+m;i++)
  24. {
  25. inv[i]*=inv[i-];
  26. inv[i]%=mode;
  27. mul[i]=mul[i-]*i%mode;
  28. }
  29. }
  30. ll C(ll x,ll y)
  31. {
  32. if(y>x)
  33. {
  34. return ;
  35. }
  36. return mul[x]*inv[y]%mode*inv[x-y]%mode;
  37. }
  38. int main()
  39. {
  40. // freopen("task.in","r",stdin);
  41. // freopen("task.out","w",stdout);
  42. scanf("%lld%lld",&n,&m);
  43. init();
  44. printf("%lld\n",((C(n+m,n)-C(n+m,n+))%mode+mode)%mode);
  45. return ;
  46. }

bzoj 1856的更多相关文章

  1. BZOJ 1856 字符串(组合)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1856 题意:有n个1和m个0组成的串,使得任意前k个中1的个数不少于0的个数.有多少种这 ...

  2. Bzoj 1856: [Scoi2010]字符串 卡特兰数,乘法逆元,组合数,数论

    1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1194  Solved: 651[Submit][Status][ ...

  3. BZOJ 1856: [Scoi2010]字符串( 组合数 )

    求(0,0)->(n,m)且在直线y=x下方(可以在y=x上)的方案数...同 http://www.cnblogs.com/JSZX11556/p/4908648.html --------- ...

  4. BZOJ 1856: [Scoi2010]字符串 [Catalan数]

    1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1418  Solved: 790[Submit][Status][ ...

  5. bzoj 1856: [Scoi2010]字符串 卡特兰数

    1856: [Scoi2010]字符串 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1458  Solved: 814[Submit][Status][ ...

  6. bzoj 1856 组合

    这道题有些类似卡特兰数的其中一种证明,总方案数是c(n+m,n),点(m,n)对应y=x-1对称点为(n+1,m-1),所以答案为c(n+m,n)-c(n+m,n+1). 反思:开始坐标轴画错了,结果 ...

  7. bzoj 1856: [Scoi2010]字符串

    #include<cstdio> #include<iostream> #define Q 20100403 ; int main() { scanf("%lld%l ...

  8. bzoj 1856 卡特兰数

    复习了一下卡特兰数.. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #d ...

  9. 字符串(bzoj 1856)

    Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...

随机推荐

  1. 1Mybatis入门--1.1单独使用jdbc编程问题总结

    1.1.1 jdbc程序 Public static void main(String[] args) { Connection connection = null; PreparedStatemen ...

  2. 使用 JavaScript 将网站后台的数据变化实时更新到前端

    问:难道只能设置定时器每隔一秒通过 Ajax 向后台请求数据来实现吗? 答: 1. nodejs的 http://socket.io 支持上述 李宏训 所说的三种方式,另外还支持 Flash Sock ...

  3. dubbo初步认识

    dubbo中文网站:http://dubbo.apache.org/zh-cn/ dubbo英文网站:http://dubbo.apache.org/en-us/ 1.Apache Dubbo是一款高 ...

  4. python 携带cookie获取页面内容

    有时会遇到爬取的页面需要登录,这就要带上cookie了. 下面记录了几种携带cookie的方法 # coding=utf-8 import requests s = requests.Session( ...

  5. seo 优化排名 使用总结

    SEO 的优化技巧 随着百度对竞价排名位置的大幅减少,SEO优化将自己的网站在首页上有更好的展示有了更多的可能. 本文将系统阐述SEO优化原理.优化技巧和优化流程. 搜索引擎的优化原理是蜘蛛过来抓取网 ...

  6. python 中的exec

    x = 10 expr = """ z = 30 sum = x + y + z print(sum) """ def func(): y ...

  7. HTTP笔记01-http相关的基础知识

    这个系列文章是阅读<图解HTTP>后写下的笔记 当我们在浏览器输入url,点击回车后,浏览器显示我们需要的web页面,那么,这个界面是如何产生的? 根据浏览器地址中输入的url,浏览器从相 ...

  8. nodejs+express+mongodb简单的例子

    简单的介绍下node+express+mongodb这三个东西.node:是运行在服务器端的程序语言,表面上看过去就是javascript一样的东西,但是呢,确实就是服务器语言,个人觉得在一定层次上比 ...

  9. 利用jsoncpp将json字符串转换为Vector

    在API测试过程中经常会遇到传入参数为复杂类型,一般情况下在python下,习惯用字典来表示复杂类型.但是c++对字符串的处理是比较弱智的,一般c++里边会用vector来存储复杂类型,那么就存在转换 ...

  10. 使用Vagrant搭建本地python开发环境

    使用Vagrant搭建本地python开发环境 关于vagrant:Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境,它使用Oracle的开源VirtualBox虚拟化系统也可以使 ...