bzoj 1856
做这题之前先看道高考真题(好像是真题,我记不清了)
例:已知一个由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
- #include <cstdio>
- #include <cmath>
- #include <cstring>
- #include <cstdlib>
- #include <iostream>
- #include <algorithm>
- #include <queue>
- #include <stack>
- #define ll long long
- #define mode 20100403
- using namespace std;
- ll inv[];
- ll mul[];
- ll n,m;
- void init()
- {
- inv[]=inv[]=;
- for(int i=;i<=n+m;i++)
- {
- inv[i]=(mode-mode/i)*inv[mode%i]%mode;
- }
- mul[]=mul[]=;
- for(int i=;i<=n+m;i++)
- {
- inv[i]*=inv[i-];
- inv[i]%=mode;
- mul[i]=mul[i-]*i%mode;
- }
- }
- ll C(ll x,ll y)
- {
- if(y>x)
- {
- return ;
- }
- return mul[x]*inv[y]%mode*inv[x-y]%mode;
- }
- int main()
- {
- // freopen("task.in","r",stdin);
- // freopen("task.out","w",stdout);
- scanf("%lld%lld",&n,&m);
- init();
- printf("%lld\n",((C(n+m,n)-C(n+m,n+))%mode+mode)%mode);
- return ;
- }
bzoj 1856的更多相关文章
- BZOJ 1856 字符串(组合)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1856 题意:有n个1和m个0组成的串,使得任意前k个中1的个数不少于0的个数.有多少种这 ...
- Bzoj 1856: [Scoi2010]字符串 卡特兰数,乘法逆元,组合数,数论
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1194 Solved: 651[Submit][Status][ ...
- BZOJ 1856: [Scoi2010]字符串( 组合数 )
求(0,0)->(n,m)且在直线y=x下方(可以在y=x上)的方案数...同 http://www.cnblogs.com/JSZX11556/p/4908648.html --------- ...
- BZOJ 1856: [Scoi2010]字符串 [Catalan数]
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1418 Solved: 790[Submit][Status][ ...
- bzoj 1856: [Scoi2010]字符串 卡特兰数
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1458 Solved: 814[Submit][Status][ ...
- bzoj 1856 组合
这道题有些类似卡特兰数的其中一种证明,总方案数是c(n+m,n),点(m,n)对应y=x-1对称点为(n+1,m-1),所以答案为c(n+m,n)-c(n+m,n+1). 反思:开始坐标轴画错了,结果 ...
- bzoj 1856: [Scoi2010]字符串
#include<cstdio> #include<iostream> #define Q 20100403 ; int main() { scanf("%lld%l ...
- bzoj 1856 卡特兰数
复习了一下卡特兰数.. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #d ...
- 字符串(bzoj 1856)
Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...
随机推荐
- 1Mybatis入门--1.1单独使用jdbc编程问题总结
1.1.1 jdbc程序 Public static void main(String[] args) { Connection connection = null; PreparedStatemen ...
- 使用 JavaScript 将网站后台的数据变化实时更新到前端
问:难道只能设置定时器每隔一秒通过 Ajax 向后台请求数据来实现吗? 答: 1. nodejs的 http://socket.io 支持上述 李宏训 所说的三种方式,另外还支持 Flash Sock ...
- dubbo初步认识
dubbo中文网站:http://dubbo.apache.org/zh-cn/ dubbo英文网站:http://dubbo.apache.org/en-us/ 1.Apache Dubbo是一款高 ...
- python 携带cookie获取页面内容
有时会遇到爬取的页面需要登录,这就要带上cookie了. 下面记录了几种携带cookie的方法 # coding=utf-8 import requests s = requests.Session( ...
- seo 优化排名 使用总结
SEO 的优化技巧 随着百度对竞价排名位置的大幅减少,SEO优化将自己的网站在首页上有更好的展示有了更多的可能. 本文将系统阐述SEO优化原理.优化技巧和优化流程. 搜索引擎的优化原理是蜘蛛过来抓取网 ...
- python 中的exec
x = 10 expr = """ z = 30 sum = x + y + z print(sum) """ def func(): y ...
- HTTP笔记01-http相关的基础知识
这个系列文章是阅读<图解HTTP>后写下的笔记 当我们在浏览器输入url,点击回车后,浏览器显示我们需要的web页面,那么,这个界面是如何产生的? 根据浏览器地址中输入的url,浏览器从相 ...
- nodejs+express+mongodb简单的例子
简单的介绍下node+express+mongodb这三个东西.node:是运行在服务器端的程序语言,表面上看过去就是javascript一样的东西,但是呢,确实就是服务器语言,个人觉得在一定层次上比 ...
- 利用jsoncpp将json字符串转换为Vector
在API测试过程中经常会遇到传入参数为复杂类型,一般情况下在python下,习惯用字典来表示复杂类型.但是c++对字符串的处理是比较弱智的,一般c++里边会用vector来存储复杂类型,那么就存在转换 ...
- 使用Vagrant搭建本地python开发环境
使用Vagrant搭建本地python开发环境 关于vagrant:Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境,它使用Oracle的开源VirtualBox虚拟化系统也可以使 ...