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 ...
随机推荐
- Python 9 进程,线程
本节内容 python GIL全局解释器锁 线程 进程 Python GIL(Global Interpreter Lock) In CPython, the global interpreter l ...
- Shiro入门 - 通过自定义Realm连数数据库进行授权
shiro-realm.ini [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Spring中的注 ...
- kotlin中“==”和“===”的区别
code 1 fun main(args: Array<String>) { val a : Int = 1000 println(a == a) //true println(a === ...
- python(四)类变量和实例变量
转载自[1] 实际这是个实例变量是否指向类变量的问题. python的类变量和实例变量,顾名思义,类变量是指跟类的变量,而实例变量,指跟类的具体实例相关联的变量,具体体现为self.x 等.实际要注意 ...
- Java开发环境配置(4)--Maven安装 环境变量配置,本地仓库配置---插件安装
说明在前:本人用过的 luna mars 等,都已经自带maven插件的了,以下有些文章是很老的,讲到maven插件的安装都可以忽略掉. maven安装eclipse在线配置maven搞定所有插件_ ...
- linux 初识系统分区
- ASP.NET MVC - 发布web应用程序、部署到IIS
发布项目 右击项目 - 发布 选择IIS - 点击发布 发布方法 - 文件系统,目标位置 - 选择与项目所在目录不同的目录(也即,指定一个发布生成文件的目录),文件发布选项 - 不选 - 点击发布 安 ...
- java知识点2
进阶篇 Java底层知识 字节码.class文件格式 CPU缓存,L1,L2,L3和伪共享 尾递归 位运算 用位运算实现加.减.乘.除.取余 设计模式 了解23种设计模式 会使用常用设计模式 单例.策 ...
- Web从入门到放弃<1>
HTML大法: <01> <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- 基于ATT和CK™框架的开放式方法评估网络安全产品
场景 提供有关如何使用特定商业安全产品来检测已知对手行为的客观见解 提供有关安全产品和服务真实功能的透明度以检测已知的对手行为 推动安全供应商社区增强其检测已知对手行为的能力 地址 https://a ...