【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】
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.
代码:
- void gcd(ll a,ll b,ll &d,ll &x,ll &y)
- {
- if (b==){
- d=;x=;y=;
- }
- else {
- gcd(b,a%b,d,y,x);y-=x*(a/b);//注意这里的y,x的区别,在递归的过程中,已经交换了x和y,所以为y-=x*(a/b);
- }
- }
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的逆元。可以由快速幂求得,但是如果数据大就太慢。
代码:
- ll ksm(ll x)//快速幂
- {
- ll tmp=x,t=,k=P-;
- while (k>){
- if (k%) t=(t*tmp)%P;
- k=k>>;
- tmp=(tmp*tmp)%P;
- }
- return t;
- }
- void pre()
- {
- inv[]=;
- for (int i=;i<=N;i++)//费马小定理求 逆
- inv[i]=ksm(i);
- }
这样,就可以A 了这道题。顺带复习了很多数论和递推知识。
代码:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define P 1000000009
- #define N 1000000
- #define ll long long
- using namespace std;
- int t;
- ll cat[N];
- void gcd(ll a,ll b,ll &d,ll &x,ll &y)
- {
- if (b==){
- d=;x=;y=;
- }
- else {
- gcd(b,a%b,d,y,x);y-=x*(a/b);
- }
- }
- ll inv(ll q,ll w)
- {
- ll d,x,y;
- gcd(q,w,d,x,y);
- return d==?(x+w)%w:-;
- }
- void pre()
- {
- cat[]=;
- for (int i=;i<=N;i++)
- cat[i]=cat[i-]*(*i-)%P*inv(i+,P)%P;
- }
- int main()
- {
- freopen("a.in","r",stdin);
- freopen("a.out","w",stdout);
- pre();
- cin>>t;
- while (t)
- {
- int n;
- scanf("%d",&n);
- printf("%I64d\n",cat[n/]);
- t--;
- }
- return ;
- }
【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】的更多相关文章
- interesting Integers(数学暴力||数论扩展欧几里得)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwwAAAHwCAIAAACE0n9nAAAgAElEQVR4nOydfUBT1f/Hbw9202m0r8
- 数论 + 扩展欧几里得 - 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< ...
- [ZLXOI2015]殉国 数论 扩展欧几里得
题目大意:已知a,b,c,求满足ax+by=c (x>=0,y>=0)的(x+y)最大值与最小值与解的个数. 直接exgcd,求出x,y分别为最小正整数的解,然后一算就出来啦 #inclu ...
- 数论--扩展欧几里得exgcd
算法思想 我们想求得一组\(x,y\)使得 \(ax+by = \gcd(a,b)\) 根据 \(\gcd(a,b) = \gcd(b,a\bmod b)\) 如果我们现在有\(x',y'\) 使得 ...
- 【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions
题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < ...
- JZYZOJ1371 青蛙的约会 扩展欧几里得 GTMD数论
http://172.20.6.3/Problem_Show.asp?id=1371 题意是两个青蛙朝同一个方向跳 http://www.cnblogs.com/jackge/archive/2013 ...
- 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS
[bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...
- 【扩展欧几里得】BAPC2014 I Interesting Integers (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- [P1082][NOIP2012] 同余方程 (扩展欧几里得/乘法逆元)
最近想学数论 刚好今天(初赛上午)智推了一个数论题 我屁颠屁颠地去学了乘法逆元 然后水掉了P3811 和 P2613 (zcy吊打集训队!)(逃 然后才开始做这题. 乘法逆元 乘法逆元的思路大致就是a ...
随机推荐
- Css Study - Top Menu in Header 横向间隔的菜单
.shortcut ul li { display: inline; } CSS <style> ol, ul { list-style: none; } html, body, ul, ...
- maven、strutst版本号
struts.2.3.15.3 :大版本号 struts1-->struts2 :分支版本号 增加新功能 :小版本号 修复bug beta:公测版release:发行版(已可以使用)Genera ...
- WPF:设置MenuItem多种不同状态图标
需求描述: 给MenuItem内部的子Image设置默认图标(鼠标leave).鼠标hover图标.和选中时的图标. 注:是给Menu内个别MenuItem修改,并且是弹出子菜单. 问题描述: 1)前 ...
- 用jxl解析excel内容
需要导入jxl.jar 下方表格为excel中内容: 序号 姓名 性别 生日 地址 1 测试1 男 1990-1-1 北京朝阳区 2 测试2 女 1998-2-2 北京海淀 3 测试3 男 1999- ...
- Kanzi入门
1.安装Kanzi. 2.使用Kanzi studio创建工程. Kanzi创建的工程会包含以下目录结构: 其中, Tool_project文件夹中存放的是设计师设计的工程,包含kanzi UI的工程 ...
- My favorite bit torrent client for Ubuntu
Deluge Bit Torrent ClientDeluge is among my favorite bit torrent clients for Ubuntu. It is fast, sli ...
- iOS开发数据库篇—SQLite的应用
iOS开发数据库篇—SQLite的应用 一.简单说明 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件. 导入头文件,可以使用库中的函数(是纯C语言的) 二 ...
- poj 3321 Apple Tree dfs序+线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Description There is an apple tree outsid ...
- onethink使用经验
1 建议随时从oschina上下载onethink的最新版本,如果你遇到了怎么都解决不了的问题,比如菜单管理自定义菜单,左侧二级菜单不显示的问题,好像有一个历史版本就是有bug,好像是1.1开始的一个 ...
- iOS - Git 代码版本管理
1.Git Git 是用 C 语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态).另一个状态可以是不同的文件,也可以是不同的文件内容. ...