ZOJ 2711 Regular Words (三维Catalan数)

题目链接:ZOJ 2711 Regular Words (三维Catalan数)

题意:给出一串3*n长度的字符,其中是含有A,B,C,满足以下条件的字符串有多少种。

1.字符串中A,B,C的个数相同。

2.该字符串的前缀中 A,B,C的个数成非递减。

做法一:一个三维的Catalan数。

做法二:三维的DP。

AC代码:

import java.math.*;
import java.util.*;

public class Main{ 

        public static void main(String[] args)
       {
                 Scanner input = new Scanner(System.in);
                 BigInteger a=null;
                 int n;
                 BigInteger f[]=new BigInteger[190];
                 f[1]=BigInteger.ONE;
                 int i;
                 for(i=2;i<=182;i++)
                 {
                	 f[i]=f[i-1].multiply(BigInteger.valueOf(i));
                 }
                 while(input.hasNext())
                 {
                	 n=input.nextInt();
                	 if(n==0)
                	 {
                		 System.out.println(0);
                		 continue;
                	 }
                	 a=BigInteger.valueOf(2);
                	 a=a.multiply(f[n*3]);
                	 a=a.divide(f[n]);
                	 a=a.divide(f[n+1]);
                	 a=a.divide(f[n+2]);

                	 System.out.println(a);
                	 System.out.println(); 

                 }

       }

}
时间: 2024-11-02 15:03:05

ZOJ 2711 Regular Words (三维Catalan数)的相关文章

zoj 2711 - Regular Words

题目:求由A,B,C构成的有序传中长度为n,且每个B前面的A的个数不少于当前B,每个C前面的B的个数不少于当前C的个数. 分析:dp,求排列组合数. 考虑二维的状况: 如果 A>=B 则在 F(A-1,B)后面放上A,在F(A,B-1)后面放上B: F(A,B)= F(A,B-1)+ F(A-1,B) { A > B }: 当 A = B 时 也满足  F(A,B)= F(A,B-1)+ F(A-1,B)= F(A,B-1)+ 0: 所以有: F(A,B)= F(A,B-1)+ F(A-1,B

Catalan数

[问题描述]对于一个栈,已知元素的进栈序列,判断一个由栈中所有元素组成的排列的出栈序列. 有N个数,则代表入栈序列为1,2,3,4,5...,N.求所有可能的出栈序列和总数. 代码如下 #include<iostream> #include<vector> #include<algorithm> #include<string> #include<stdio.h> using namespace std; int N = -1; int sum

UVA 10312 - Expression Bracketing(数论+Catalan数)

题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1253">10312 - Expression Bracketing 题意:有n个x,要求分括号,推断非二叉表达式的个数. 思路:二叉表达式的计算方法就等于是Catalan数的,那么仅仅要计算出总数,用总数减去二叉表达式个数.得到的就是非二叉表达式的个数. 那么计算方法是什么呢. 看题目中的图,对于n = 4的情况,能够分为这几种情况来讨论

UVA10303 - How Many Trees?(java大数+catalan数)

UVA10303 - How Many Trees?(java大数+catalan数) 题目链接 题目大意:给你1-N N个数,然后要求由这些数构成二叉搜索树,问有多少种这样的二叉搜索树. 解题思路:把前5项理出来,正好是1 2 5 14 42..就猜想是catalan数,结果也是对了.公式f(i + 1) = (4?i - 6)/ i; (i >= 2).结果很大,要用高精度. 代码: import java.util.*; import java.math.*; import java.io

【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个人

【catalan数】10076 - 凸多边形分割

[catalan数]10076 - 凸多边形分割 Time Limit: 1000MS Memory Limit: 32768KB 这题不能用通项公式 我忘记了mod不支持除法 我忘记了mod不支持除法 1 # include<cstdio> 2 # include<iostream> 3 using namespace std; 4 const int maxn=250; 5 typedef unsigned long long LL; 6 LL f[maxn]; 7 int m

Catalan数——卡特兰数

一.Catalan数的定义 令h(0)=1,h(1)=1,Catalan数满足递归式:h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0)  (n>=2) 该递推关系的解为:h(n) = C(2n,n)/(n+1),n=0,1,2,3,... (其中C(2n,n)表示2n个物品中取n个的组合数) 二.问题描述 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 问题分析: 我们先把这12个

HDU 4828 - Grids (Catalan数)

题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4828 Catalan数的公式为 C[n+1] = C[n] * (4 * n + 2) / (n + 2) 题目要求对M = 1e9+7 取模 利用乘法逆元将原式中除以(n+2)取模变为对(n+2)逆元的乘法取模 C[n+1] = C[n] * (4 * n + 2) * Pow(n+2, MOD-2) % MOD 其中Pow用快速幂解决 #include <cstdio> #include

关于Catalan数

问题的由来:编号为 1 到 n 的 n 个元素,顺序的进入一个栈,则可能的出栈序列有多少种? 对问题的转化与思考:n 个元素进栈和出栈,总共要经历 n 次进栈和 n 次出栈.这就相当于对这 2n 步操作进行排列.问题等价于:n个1和n个0组成一2n位的2进制数,要求从左到右扫描,1的累计数不小于0的累计数,试求满足这条件的数有多少? 解答: 设P2n为这样所得的数的个数. 在2n位上填入n个1的方案数为 C(n 2n)不填1的其余n位自动填以数0.从C(n 2n)中减去不符合要求的方案数即为所求