组合数学/python


3907: 网格

Time Limit: 1 Sec  Memory Limit: 256 MB
Submit: 162  Solved: 76
[Submit][Status][Discuss]

Description


城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m。现在从A(0,
0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的点,即任何途径的点(x, y)都要满足x >=
y,请问在这些前提下,到达B(n, m)有多少种走法。

Input

输入文件中仅有一行,包含两个整数n和m,表示城市街区的规模。

Output

输出文件中仅有一个整数和一个换行/回车符,表示不同的方案总数。

Sample Input

6 6

Sample Output

132

HINT

100%的数据中,1 <= m <= n <= 5 000

Source

[Submit][Status][Discuss]

  题面很容易想到Catalan数……但是5000的范围实在是有些吃不消……

  题解:http://www.cnblogs.com/mhy12345/p/4343980.html

copy了下代码sorry……  

  UPD:(2015-04-02 16:53:03)

  好吧我还是来写一下吧:

    我们求不越过$y=x$这条线的方案数不是很好求,那么我们就利用补集转化的思想来求。首先所有方案的总数是$C(n+m,n)$,其中所有不合法的方案,即中途跨过了$ y=x $这条线的路径,我们都可以将跨越点之后的路径翻折一下,得到一条从(1,1)到(m,n)的路线,也就是说,所有不合法的方案数之和即为C(n+m,n-1)。容我三思QAQ,或者哪位路过的神犇指点我一下……

    啊哩怎么跟我当初抄的代码不太一样= =?

 /**************************************************************
Problem: 3907
User: Tunix
Language: Python
Result: Accepted
Time:1184 ms
Memory:79228 kb
****************************************************************/ def C(n,m):
return fact[n]/fact[m]/fact[n-m];
f=raw_input().split(" ");
n=int(f[]);
m=int(f[]);
tot=max(n,m)*;
fact=[];
for i in range(,tot+):
fact.append(fact[-]*i);
c=n-m;
ans=C(tot-c,tot/)-C(tot-c,tot/+);
print ans;

  UPD:(2015年4月19日 20:21:03)

  Orz ykz神犇,提供了他的题解&高精C++代码:

我们假设0表示向右走,1表示向上走,那么很显然问题可以转化为:给你n个0和m个1,求出满足某个条件的01串的个数,这个条件是——对于任意一个子串s[1…i],0的个数不小于1的个数。我们可以用补集转化的方法,所有的01串的个数为$\binom{n+m}{m}$,然后我们再考虑不合法的01串个数。我们假定现在有一个01串,它的0和1的个数分别是n和m,第一次出现不满足条件的位置是i。即s[1…i]当中,0的个数=1的个数-1,并且s[i]=1。我们把s[1…i]的所有0变成1,1变成0,这样,我们得到的新的01串,这个串当中,0和1的个数分别为n+1,m-1。我们发现,这个转化是一一对应的,也就是说,每一个不合法的01串,都对应了一个唯一的一个n+1,m-1的01串;而这个n+1,m-1的01串也正好和唯一的这个不合法串对应,满足充要性。于是我们得到了不合法的01串的个数就是$\binom{n+m}{m-1}$。然后就可以出解啦,为了避免除以0(因为有m-1)我们这么搞:$$ans=\binom{n+m}{m}-\binom{n+m}{n+1} ( \binom{n+m}{m-1}=\binom{n+m}{n+1})$$
 /**************************************************************
Problem: 3907
User: Tunix
Language: C++
Result: Accepted
Time:84 ms
Memory:944 kb
****************************************************************/ #include<cstdio>
#include<cstring> typedef long long LL; const int N=;
const LL mod=; int tot=,x[N],p[N],v[N]={};
LL a[],b[]; LL pow(LL x,int p) {
LL t=;for (;p;p>>=,x*=x) if (p&) t*=x;return t;
} void mul(LL a[],LL y) {
LL x=,&l=a[];
for (int i=;i<=l;i++) {
a[i]=a[i]*y+x;
x=a[i]/mod;
a[i]%=mod;
}
while (x) a[++l]=x%mod,x/=mod;
} void dec(LL a[],LL b[]) {
LL &l=a[];
for (int i=;i<=l;i++) {
if (a[i]<b[i]) a[i+]--,a[i]+=mod;
a[i]-=b[i];
}
while (!a[l]) l--;
} void getc(LL a[],int n,int m) {
memset(x,,sizeof x);
for (int i=;i<=n;i++) x[i]++;
for (int i=;i<=m;i++) x[i]--;
for (int i=;i<=n-m;i++) x[i]--;
for (int i=n;i>=;i--)
if (!v[i]) mul(a,pow(i,x[i]));
else x[v[i]]+=x[i],x[i/v[i]]+=x[i];
} void print(LL a[]) {
int l=a[];
printf("%lld",a[l]);
for (int i=l-;i>=;i--) printf("%08lld",a[i]);
printf("\n");
} int main() {
int n,m;
scanf("%d%d",&n,&m);
for (int i=;i<=n+m;i++) {
if (!v[i]) p[++tot]=i;
for (int j=,k;j<=tot,(k=p[j]*i)<=n+m;j++) {
v[k]=p[j];
if (i%p[j]==) break;
}
}
a[]=a[]=b[]=b[]=;
getc(a,n+m,n);
getc(b,n+m,n+);
dec(a,b);
print(a);
return ;
}

【BZOJ】【3907】网格的更多相关文章

  1. bzoj 3907: 网格 组合数学

    3907: 网格 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 13  Solved: 7[Submit][Status][Discuss] Descr ...

  2. BZOJ 3907: 网格( 组合数 + 高精度 )

    (0,0)->(n,m)方案数为C(n,n+m), 然后减去不合法的方案. 作(n,m)关于y=x+1的对称点(m-1,n+1), 则(0,0)->(m-1,n+1)的任意一条路径都对应( ...

  3. BZOJ 3907: 网格 [Catalan数 高精度]

    3907: 网格 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 402  Solved: 180[Submit][Status][Discuss] De ...

  4. BZOJ 3907: 网格

    Description 求不跨过直线 \(y=x\) ,到达 \((n,m)\) 的方案数. Sol 组合数学+高精度. 这个推导过程跟 \(Catalan\) 数是一样的. 答案就是 \(C^{n+ ...

  5. bzoj 3907 网格 bzoj2822 [AHOI2012]树屋阶梯——卡特兰数(阶乘高精度模板)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3907 https://www.lydsy.com/JudgeOnline/problem.p ...

  6. BZOJ 3907: 网格【组合数学】

    Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m.现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过 ...

  7. 【BZOJ 3907】网格 组合数学

    大家说他是卡特兰数,其实也不为过,一开始只是用卡特兰数来推这道题,一直没有怼出来,后来发现其实卡特兰数只不过是一种组合数学,我们可以退一步直接用组合数学来解决,这道题运用组合数的思想主要用到补集与几何 ...

  8. 【BZOJ 3907】网格(Catalan数)

    题目链接 这个题推导公式跟\(Catalan\)数是一样的,可得解为\(C_{n+m}^n-C_{n+m}^{n+1}\) 然后套组合数公式\(C_n^m=\frac{n!}{m!(n-m)!}\) ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. 从零开始之ecshop基础篇(17)

    目标:基于自定义的mvc框架开发的案例(项目) 项目周期    需求分析 典型的业务逻辑:    电子商务:商城(京东),B2C,C2C(淘宝),团购,秒杀,代购 内容管理:新浪门户类,优酷视频管理, ...

  2. web.xml中常见配置解读

    文章转自:http://blog.csdn.net/sdyy321/article/details/5838791 有一般XML都必须有的版本.编码.DTD <web-app>下子元素&l ...

  3. Jquery note

    the purpose: write less. do more   写得少,做更多 jquery 基本选择器, $("p ,div ")匹配所有的P元素和DIV元素 , $(&q ...

  4. 关联参数(&的用法)

    <?php header("Content-Type:text/html;charset=gb2312"); function test1(&$a){ $a.=&qu ...

  5. django-url调度器-高级篇

    我们在中级篇中学会了如何进行反向解析,但是有这样一个问题,在为 url 命名的时候,名字不能重复,否则会导致各种各样的问题.在 url 还少的时候保证不重名还是比较简单的,但是 url 多起来以后就比 ...

  6. android ptl

    Gerrit android update sdk --no-uiadb logcat MyActivity:* *:S Connecting adb over Wi-Fiadb tcpip 5555 ...

  7. NOJ1018-深度遍历二叉树

    题目要求很简单,前中后序遍历一棵二叉树.坑爹的是这道题的输入数据和测试数据压根不一样,找了好久原因,去讨论区看见有别人发的测试样例,修改了一下就AC了 测试样例是这个:DEH##FJ##G#CK### ...

  8. 算法系列5《SSF33》

    SSF33算法是以128位分组为单位进行运算,密钥长度为16字节,该算法也可以被用于安全报文传送和MAC机制密文运算. 使用SSF33算法和基于3-DES的对称加密机制使用相同长度的密钥,能够同原有的 ...

  9. oracle11g 重新配置em

    OS: ORACLE-LINUX 5.7 DB: 11.2.0.3 [oracle@b28-122 ~]$ emctl status dbconsoleOracle Enterprise Manage ...

  10. oracle自定义job名字,job调度

    一.调试创建 begin -- create_schedule dbms_scheduler.create_schedule(schedule_name => 's_change_send_da ...