Problem:  

  n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案。mod 1e9+9

Solution:

  这道题由1,2,5,14 应该想到Catalan数,但是我却花了两个小时去找递推式。

  首先 Catalan数 :

  基本规律:1,2,5,14,42,132,..........

典型例题:

  1、多边形分割。一个多边形分为若干个三角形有多少种分法。

    C(n)=∑(i=2...n-1)C(i)*C(n-i+1)

  2、排队问题:转化为n个人在第一行为0,第二行为1,则n个人的序列中,在1前面的所有0,1中,0的个数一定要大于1。

        见:http://blog.csdn.net/vast_sea/article/details/8173362      。类似于下一个问题。

  3、出入栈问题:问出入栈的方案数。

    与上一个问题相似,转换为0 为入栈,1为出栈,则合法的出入栈方案有多少?

  4,、括号匹配问题:n对括号有多少种匹配方式?类似于出入栈。

  5、二叉树问题:n个节点的二叉树有多少种形式?

     用T(i,j)表示 左节点 i 个,右节点 j 个。则根节点一定有一个,所以形式数为:T(0,n-1),T(1,n-2),T(2,n-3)....

     f[n]=f[0]*f[n-1]+f[1]*f[n-2]+.....+f[n]*f[0]

其次,Catalan数问题解决后,我们用C(n)=C(n-1)*(4*n-2)/(n-1)求解(不要问我哪里来的,我也不知道)。然后就会发现一个问题:

  A/BmodP 在数据大的情况下可能会出错,而A/BmodP肯定不等于AmodP/BmodP,这时就需要用到 逆元 了。

逆元:

  ax≡1(mod P)    ->  ax mod P=1 mod P = 1  ->    b/a*(ax) mod P == b/a mod P==b*x mod P

即 x 为a mod P的逆元。

求逆元的方式:

  1、扩展欧几里得:

    因为ax≡1(mod P),所以ax-1=nP,即ax-1为P的倍数。所以移项得:ax-nP=1。然后由扩展欧几里得算法推出x的解。

    扩展欧几里得算法推导:

      设 ax1+by1=gcd(a,b)    ∵gcd(a,b)=gcd(b,a%b)   ∴bx2+(a%b)y2=ax1+by1

      ∵a%b=a-(a/b)*b   ∴bx2+ay2-(a/b)*b*y2=ax1+by1

      根据恒等定理:x1=y2;  y1=x2-(a/b)*y2

    这样我们可以用递归求解,直到 b==0,x=1,y=0。递归x2,y2求x1,y1.

 代码:

  1. void gcd(ll a,ll b,ll &d,ll &x,ll &y)
  2. {
  3. if (b==){
  4. d=;x=;y=;
  5. }
  6. else {
  7. gcd(b,a%b,d,y,x);y-=x*(a/b);//注意这里的y,x的区别,在递归的过程中,已经交换了x和y,所以为y-=x*(a/b);
  8. }
  9. }

  2、费马小定理:

    a^(p-1)≡1(mod P)

    则: a*a^(p-2)≡1(mod P)

    逆元:ax≡1(mod P),则x为a^(p-2),x为a mod P的逆元。可以由快速幂求得,但是如果数据大就太慢。

 代码:

  1. ll ksm(ll x)//快速幂
  2. {
  3. ll tmp=x,t=,k=P-;
  4. while (k>){
  5. if (k%) t=(t*tmp)%P;
  6. k=k>>;
  7. tmp=(tmp*tmp)%P;
  8. }
  9. return t;
  10. }
  11. void pre()
  12. {
  13. inv[]=;
  14. for (int i=;i<=N;i++)//费马小定理求 逆
  15. inv[i]=ksm(i);
  16. }

  这样,就可以A 了这道题。顺带复习了很多数论和递推知识。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define P 1000000009
  6. #define N 1000000
  7. #define ll long long
  8. using namespace std;
  9. int t;
  10. ll cat[N];
  11. void gcd(ll a,ll b,ll &d,ll &x,ll &y)
  12. {
  13. if (b==){
  14. d=;x=;y=;
  15. }
  16. else {
  17. gcd(b,a%b,d,y,x);y-=x*(a/b);
  18. }
  19. }
  20. ll inv(ll q,ll w)
  21. {
  22. ll d,x,y;
  23. gcd(q,w,d,x,y);
  24. return d==?(x+w)%w:-;
  25. }
  26. void pre()
  27. {
  28. cat[]=;
  29. for (int i=;i<=N;i++)
  30. cat[i]=cat[i-]*(*i-)%P*inv(i+,P)%P;
  31. }
  32. int main()
  33. {
  34. freopen("a.in","r",stdin);
  35. freopen("a.out","w",stdout);
  36. pre();
  37. cin>>t;
  38. while (t)
  39. {
  40. int n;
  41. scanf("%d",&n);
  42. printf("%I64d\n",cat[n/]);
  43. t--;
  44. }
  45. return ;
  46. }

  

【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】的更多相关文章

  1. interesting Integers(数学暴力||数论扩展欧几里得)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwwAAAHwCAIAAACE0n9nAAAgAElEQVR4nOydfUBT1f/Hbw9202m0r8

  2. 数论 + 扩展欧几里得 - SGU 106. The equation

    The equation Problem's Link Mean: 给你7个数,a,b,c,x1,x2,y1,y2.求满足a*x+b*y=-c的解x满足x1<=x<=x2,y满足y1< ...

  3. [ZLXOI2015]殉国 数论 扩展欧几里得

    题目大意:已知a,b,c,求满足ax+by=c (x>=0,y>=0)的(x+y)最大值与最小值与解的个数. 直接exgcd,求出x,y分别为最小正整数的解,然后一算就出来啦 #inclu ...

  4. 数论--扩展欧几里得exgcd

    算法思想 我们想求得一组\(x,y\)使得 \(ax+by = \gcd(a,b)\) 根据 \(\gcd(a,b) = \gcd(b,a\bmod b)\) 如果我们现在有\(x',y'\) 使得 ...

  5. 【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions

    题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < ...

  6. JZYZOJ1371 青蛙的约会 扩展欧几里得 GTMD数论

    http://172.20.6.3/Problem_Show.asp?id=1371 题意是两个青蛙朝同一个方向跳 http://www.cnblogs.com/jackge/archive/2013 ...

  7. 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS

    [bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...

  8. 【扩展欧几里得】BAPC2014 I Interesting Integers (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  9. [P1082][NOIP2012] 同余方程 (扩展欧几里得/乘法逆元)

    最近想学数论 刚好今天(初赛上午)智推了一个数论题 我屁颠屁颠地去学了乘法逆元 然后水掉了P3811 和 P2613 (zcy吊打集训队!)(逃 然后才开始做这题. 乘法逆元 乘法逆元的思路大致就是a ...

随机推荐

  1. Css Study - Top Menu in Header 横向间隔的菜单

    .shortcut ul li { display: inline; } CSS <style> ol, ul { list-style: none; } html, body, ul, ...

  2. maven、strutst版本号

    struts.2.3.15.3 :大版本号 struts1-->struts2 :分支版本号 增加新功能 :小版本号 修复bug beta:公测版release:发行版(已可以使用)Genera ...

  3. WPF:设置MenuItem多种不同状态图标

    需求描述: 给MenuItem内部的子Image设置默认图标(鼠标leave).鼠标hover图标.和选中时的图标. 注:是给Menu内个别MenuItem修改,并且是弹出子菜单. 问题描述: 1)前 ...

  4. 用jxl解析excel内容

    需要导入jxl.jar 下方表格为excel中内容: 序号 姓名 性别 生日 地址 1 测试1 男 1990-1-1 北京朝阳区 2 测试2 女 1998-2-2 北京海淀 3 测试3 男 1999- ...

  5. Kanzi入门

    1.安装Kanzi. 2.使用Kanzi studio创建工程. Kanzi创建的工程会包含以下目录结构: 其中, Tool_project文件夹中存放的是设计师设计的工程,包含kanzi UI的工程 ...

  6. My favorite bit torrent client for Ubuntu

    Deluge Bit Torrent ClientDeluge is among my favorite bit torrent clients for Ubuntu. It is fast, sli ...

  7. iOS开发数据库篇—SQLite的应用

    iOS开发数据库篇—SQLite的应用 一.简单说明 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件. 导入头文件,可以使用库中的函数(是纯C语言的) 二 ...

  8. poj 3321 Apple Tree dfs序+线段树

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K       Description There is an apple tree outsid ...

  9. onethink使用经验

    1 建议随时从oschina上下载onethink的最新版本,如果你遇到了怎么都解决不了的问题,比如菜单管理自定义菜单,左侧二级菜单不显示的问题,好像有一个历史版本就是有bug,好像是1.1开始的一个 ...

  10. iOS - Git 代码版本管理

    1.Git Git 是用 C 语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态).另一个状态可以是不同的文件,也可以是不同的文件内容. ...