HDU 4828 Grids(卡特兰数+乘法逆元)
首先我按着我的理解说一下它为什么是卡特兰数,首先卡特兰数有一个很典型的应用就是求1~N个自然数出栈情况的种类数。而这里正好就对应了这种情况。我们要满足题目中给的条件,数字应该是从小到大放置的,1肯定在左上角,所以1入栈,这时候我们放2,如果我们把2放在了1的下面就代表了1出栈,把2放在上面就代表了2也进栈(可以看一下hint中第二组样例提示),以此类推,这样去放数,正好就对应了上面一行入栈,下面一行出栈的情况,一共n行,对应上限为n的卡特兰数。
需要注意的地方就是在使用卡特兰数递推式的时候,除法是不遵循同余膜定理的,所以需要用到乘法逆元,设我们要除的数为n,取的膜为mod,那么n的乘法逆元就是,当n与mod互质的时候,通过欧几里得定理n*x + y*mod = gcd(n,m)得到x,将x处理为(x%mod + mod)% mod的形式,就是我们要的乘法逆元。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1000010
#define mod 1000000007
#define LL long long
LL ktl[maxn],x,y;
LL exgcd(LL a,LL b)
{
if(b == )
{
x = ;
y = ;
return a;
}
LL gcd = exgcd(b,a%b);
LL tmp;
tmp = x;
x = y;
y = tmp - a/b * y;
return gcd;
}
LL yiyuan(int n)
{
LL gcd = exgcd(n,mod);
if(gcd == )
return (x%mod + mod) % mod;
}
void init()
{
memset(ktl,,sizeof(ktl));
ktl[] = ;
for(int i = ; i <= maxn-; i++)
{
ktl[i] = (ktl[i-]*(*i-)%mod * yiyuan(i+)) % mod;
}
}
int main()
{
int t,n,ca = ;
init();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("Case #%d:\n",++ca);
printf("%I64d\n",ktl[n]);
}
return ;
}
HDU 4828 Grids(卡特兰数+乘法逆元)的更多相关文章
- hdu 4828 Grids 卡特兰数+逆元
Grids Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Problem D ...
- HDU 4828 - Grids (Catalan数)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4828 Catalan数的公式为 C[n+1] = C[n] * (4 * n + 2) / (n ...
- Bzoj 1856: [Scoi2010]字符串 卡特兰数,乘法逆元,组合数,数论
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1194 Solved: 651[Submit][Status][ ...
- hdu 4828 Grids(拓展欧几里得+卡特兰数)
题目链接:hdu 4828 Grids 题目大意:略. 解题思路:将上一行看成是入栈,下一行看成是出栈,那么执着的方案就是卡特兰数,用递推的方式求解. #include <cstdio> ...
- 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)
题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...
- hdu 5184 类卡特兰数+逆元
BC # 32 1003 题意:定义了括号的合法排列方式,给出一个排列的前一段,问能组成多少种合法的排列. 这道题和鹏神研究卡特兰数的推导和在这题中的结论式的推导: 首先就是如何理解从题意演变到卡特兰 ...
- hdu 5673 Robot 卡特兰数+逆元
Robot Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- HDU 3923 Invoker(polya定理+乘法逆元(扩展欧几里德+费马小定理))
Invoker Time Limit : 2000/1000ms (Java/Other) Memory Limit : 122768/62768K (Java/Other) Total Subm ...
- hdu 5184(数学-卡特兰数)
Brackets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
随机推荐
- [ An Ac a Day ^_^ ] CodeForces 680A Bear and Five Cards
这两天回家了 家里电脑太卡 调试不方便 就只能写写水题了…… #include<stdio.h> #include<iostream> #include<algorith ...
- amazeui 后台模板
<!doctype html> <html class="no-js"> <head> <meta charset="utf-8 ...
- Linux CPU 核数检查脚本
#!/bin/bash physicalNumber=0 coreNumber=0 logicalNumber=0 HTNumber=0 logicalNumber=$(grep "proc ...
- 测试sql性能方法
SET STATISTICS io ON SET STATISTICS time ON go ---你要测试的sql语句 selec ...
- grub4dos新手指南-2
Grub4dos 新手指南 一.GRUB4DOS的配置文件Grub4dos 有三个文件,grldr.grldr.mbr和menu.lst,配置文件是menu.lst,和GRUB一样.该文件一般放在和启 ...
- input type="file" 的一些问题
file可以上传文件,但通常 情况下大家都会需要设置文件上传的格式 上传文件的格式由一个 accept 属性来控制 列如: <input type="file" id=&qu ...
- 十二、oracle 数据库(表)的逻辑备份与恢复
一.介绍逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程.逻辑恢复是指当数据库对象被误操作而损坏后使用工具import利用备份的文件把数据对象导入到数据库的过程.物理备份即可在数 ...
- AutoTile 自动拼接 番外篇(自动融合技术)
http://pan.baidu.com/s/1dDQyfSl 密码:ttud 先睹为快吧. 之后 还差一个 智能替换 技术.
- Codeforces Round 371 Div2 B.Passwords
原题: B. Passwords time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- android性能调优之traceview的使用
1.在开始使用TraceView你要注意: 你的设备和模拟器必须设置SD card 和 你的程序拥有对SD card 具有读写操作的权限( <uses-permission android:na ...