Grids HDU - 4828(卡特兰数)组合数学

Problem Description

度度熊最近很喜欢玩游戏。这一天他在纸上画了一个2行N列的长方形格子。他想把1到2N这些数依次放进去,但是为了使格子看起来优美,他想找到使每行每列都递增的方案。不过画了很久,他发现方案数实在是太多了。度度熊想知道,有多少种放数字的方法能满足上面的条件?

Input

第一行为数据组数T(1<=T<=100000)。
然后T行,每行为一个数N(1<=N<=1000000)表示长方形的大小

Output

对于每组数据,输出符合题意的方案数。由于数字可能非常大,你只需要把最后的结果对1000000007取模即可。

Sample Input

2
1
3

Sample Output

Case #1:
1
Case #2:
5

Hint

对于第二组样例,共5种方案,具体方案为:在这里插入图片描述
思路:
卡特兰数把第一行数看作为 0 0 0
第二行数看作为 1 1 1

000111 000111 000111 的序列就为
123 123 123
456 456 456
001011 001011 001011的序列就为
124 124 124
356 356 356
则这个问题就转化成有几种满足题目条件的 01 01 01 序列
在这里插入图片描述
从A点到B点红线上的值为卡特兰数其前几项为(从第零项开始) : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …

卡特兰数 C n C_{n} Cn 满足以下递推关系

  1. C n + 1 = C 0 C n + C 1 C n − 1 + . . . + C n C 0 C_{n+1}=C_{0}C_{n}+C_{1}C_{n-1}+...+C_{n}C_{0} Cn+1=C0Cn+C1Cn1+...+CnC0;
  2. ( n − 3 ) C n = n / 2 ( C 3 C n − 1 + C 4 C n − 2 + C 5 C n − 3 + . . . + C n − 2 C 4 + C n − 1 C 3 ) (n-3)C_{n}=n/2(C_{3}C_{n-1}+C_{4}C_{n-2}+C_{5}C_{n-3}+...+C_{n-2}C_{4}+C_{n-1}C_{3}) (n3)Cn=n/2(C3Cn1+C4Cn2+C5Cn3+...+Cn2C4+Cn1C3);

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int maxx=1e6+5;
ll f[maxx];
ll fi[maxx];
void init(){
     f[0]=1,f[1]=1;
     for(int i=2;i<=maxx;i++){
            f[i]=(mod-mod/i)*f[mod%i]%mod;
     }
     fi[0]=1;fi[1]=1;fi[2]=1;
     for(int i=3;i<=maxx;i++){
        fi[i]=fi[i-1]*((4+10*mod-6*f[i-1])%mod)%mod;
     }
}
int main(){
    int t,Case=0;
    scanf("%d",&t);
    init();
    while(t--){
        int n;
        scanf("%d",&n);
        printf("Case #%d:\n%lld\n",++Case,fi[n+2]);
    }
    return 0;
}

实践是检验真理的唯一标准

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值