其实。。这题是《组合数学》的习题中的一道。。。。。。当初不会。。。。。

想到一个证明:

填入2n个数,把填在上方的数的位置填上+1,下方的填上-1。这样,在序列1....2n的位置,任意前部分和都是>=0且是符合题意的。为什么?首先,可以知道,按+1/-1的位置按顺序在上方或下方填数,必定是符合递增的。其次,是否存在不符合部分和>=0而又满足题意的呢?不妨设最小不符合部分和的数为k,则k必在下方。那么,必定要在它的上方填上一个比它小的赋为+1值的位置的数吧。而前k-1个数必为偶数,又因为要满足递增要求,必定是刚好填满两行的前(k-1)/2个格子,这样,就找不到可以填在k上方的数了。所以,任意前部分和都是>=0且是符合题意的。

所以,这个数必定是卡特兰数。

事后诸葛亮了一把。。。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define LL __int64
#define M 1000000007
#define N 1000000
using namespace std; LL Cata[N+1]; void exgcd(__int64 a,__int64 b,__int64 &x,__int64 &y){
if(b==0){
x=1; y=0;
return ;
}
exgcd(b,a%b,x,y);
__int64 t=x;
x=y;
y=t-a/b*y;
} void initial(){
Cata[1]=1;
LL x,y;
for(int i=2;i<=N;i++){
Cata[i]=(Cata[i-1]*(4*i-2))%M;
exgcd(i+1,M,x,y);
Cata[i]=((Cata[i]*((x%M+M)%M))%M+M)%M;
}
} int main(){
LL n;int T,kase=0;
initial();
scanf("%d",&T);
while(T--){
scanf("%I64d",&n);
printf("Case #%d:\n",++kase);
printf("%I64d\n",Cata[n]);
}
return 0;
}

  

HDU 4828的更多相关文章

  1. hdu 4828 Grids(拓展欧几里得+卡特兰数)

    题目链接:hdu 4828 Grids 题目大意:略. 解题思路:将上一行看成是入栈,下一行看成是出栈,那么执着的方案就是卡特兰数,用递推的方式求解. #include <cstdio> ...

  2. HDU 4828 (卡特兰数+逆)

    HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0.后n个人标为1.然后去全排列,全排列的数列.假设每一个1的前面相应的0大于等于1,那么就是满足的序列,假设把0看成入栈,1看 ...

  3. HDU 4828 (卡特兰数+逆元)

    HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0,后n个人标为1.然后去全排列,全排列的数列,假设每一个1的前面相应的0大于等于1,那么就是满足的序列.假设把0看成入栈,1看 ...

  4. HDU 4828 - Grids (Catalan数)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4828 Catalan数的公式为 C[n+1] = C[n] * (4 * n + 2) / (n ...

  5. HDU 4828 小明系列故事——捉迷藏

    漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others)    Memo ...

  6. hdu 4828 Grids 卡特兰数+逆元

    Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Problem D ...

  7. [HDU 4828] Grids

    Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  8. HDU 4828 Grids(卡特兰数+乘法逆元)

    首先我按着我的理解说一下它为什么是卡特兰数,首先卡特兰数有一个很典型的应用就是求1~N个自然数出栈情况的种类数.而这里正好就对应了这种情况.我们要满足题目中给的条件,数字应该是从小到大放置的,1肯定在 ...

  9. HDU 4828 逆元+catalan数

    Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

随机推荐

  1. lim的日常生活

     

  2. Ubuntu16.04编译cmake源码

    编译版本:cmake-3.8.0-rc2 为了能够编译出ccmake和cmake-gui,首先需要安装libncurses5-dev sudo apt install libncurses5-dev ...

  3. 游戏开发人员眼中的Unity 3D网页游戏測评报告

    眼下.能够实现3D页游的主流技术有Silverlight.XNA.Flash.HTML5和Unity3D. 当中.Unity3D作为一款专注于3D游戏的浏览器插件.最近在国内外页游产品线骚动异常:本人 ...

  4. [ACM] FZU 1686 神龙的难题 (DLX 反复覆盖)

    Problem 1686 神龙的难题 Accept: 444    Submit: 1365 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Pro ...

  5. PHP生成二维码的2种方式

    二维码的用处俺也就不说了,看一下用PHP生成的二维码吧. 利用谷歌提供的API 生成二维码,如今非常多国外站点都提供了这类API 看下代码吧<=======================> ...

  6. UI_KVC赋值

    使用KVC对person的属性进行赋值 [aperson setValue:@"yadong" forKey:@"name"]; [aperson setVal ...

  7. Codeforces 456B Fedya and Maths 打表找规律

    Description Fedya studies in a gymnasium. Fedya's maths hometask is to calculate the following expre ...

  8. 21.QT二进制文件

    #include "mainwindow.h" #include <QApplication> #include <QFile> #include < ...

  9. 20.QT文本文件读写

    #include "mainwindow.h" #include "ui_mainwindow.h" #include <QFile> #inclu ...

  10. 抓取git的log文件批处理命令示例

    @echoset sincedate="2016-04-28 00:00:01"          ::变量set beforedate="2016-04-29 00:0 ...