light oj1170 - Counting Perfect BST卡特兰数
BST is the acronym for Binary Search Tree. A BST is a tree data structure with the following properties.
i) Each BST contains a root node and the root may have zero, one or two children. Each of the children themselves forms the root of another BST. The two children are classically referred to as left child and right child.
ii) The left subtree, whose root is the left children of a root, contains all elements with key values less than or equal to that of the root.
iii) The right subtree, whose root is the right children of a root, contains all elements with key values greater than that of the root.
An integer m is said to be a perfect power if there exists integer x > 1 and y > 1 such that m = xy. First few perfect powers are {4, 8, 9, 16, 25, 27, 32, 36, 49, 64, 81, 100, 121, 125, 128, 144, ...}. Now given two integer a and b we want to construct BST using all perfect powers between a and b, where each perfect power will form the key value of a node.
Now, we can construct several BSTs out of the perfect powers. For example, given a = 1 and b = 10, perfect powers between a and b are 4, 8, 9. Using these we can form the following five BSTs.
4 4 8 9 9
\ \ / \ / /
8 9 4 9 4 8
\ / \ /
9 8 8 4
In this problem, given a and b, you will have to determine the total number of BSTs that can be formed using perfect powers between a and b.
Input
Input starts with an integer T (≤ 20000), denoting the number of test cases.
Each case of input contains two integers: a and b (1 ≤ a ≤ b ≤ 1010, b - a ≤ 106) as defined in the problem statement.
Output
For each case, print the case number and the total number of distinct BSTs that can be formed by the perfect powers between a and b. Output the result modulo 100000007.
Sample Input |
Output for Sample Input |
|
4 1 4 5 10 1 10 1 3 |
Case 1: 1 Case 2: 2 Case 3: 5 Case 4: 0 |
分析:先筛选出a, b间的完美幂,然后就是求卡特兰数了,既可以用递推,也可以用求逆元的方法。
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<set>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#define N 111111
#define mod 100000007
typedef long long ll;
using namespace std;
ll num[N];
ll d[1111];
int k;
void init()
{
for(ll i = 2; i * i < 10000000000L; ++i)
{
for(int j = 2; ; ++j)
{
if(pow(i, j) > 10000000000L)
break;
num[k++] = pow(i, j);
}
}
sort(num, num + k);
k = unique(num, num + k) - num;
/*在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),
其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,
然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。
*/
memset(d, 0, sizeof(d));
d[0] = 1;
d[1] = 1;
for(int i = 2; i < 1111; i++)
{
for(int j = 1; j <= i; j++)
{
d[i] += d[i - j] * d[j-1];
d[i] %= mod;
}
/*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个的组合数)
*/
///卡特兰数应用链接:http://www.cnblogs.com/yaoyueduzhen/p/5456490.html
}
}
int getcnt(ll a, ll b)
{
int t1 = upper_bound(num, num+k, b) - num;///返回一个非递减序列中的第一个大于val的位置
int t2 = lower_bound(num, num+k, a) - num;///返回一个非递减序列中的第一个大于等于值val的位置
return t1 - t2;
}
int main(void)
{
int T, cas;
ll a, b;
scanf("%d", &T);
cas = 0;
init();
d[0] = 0;
while(T--)
{
scanf("%lld%lld", &a, &b);
cas++;
printf("Case %d: %lld\n", cas, d[getcnt(a, b)]);
}
}
light oj1170 - Counting Perfect BST卡特兰数的更多相关文章
- 1170 - Counting Perfect BST
1170 - Counting Perfect BST PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...
- LightOJ - 1170 - Counting Perfect BST(卡特兰数)
链接: https://vjudge.net/problem/LightOJ-1170 题意: BST is the acronym for Binary Search Tree. A BST is ...
- LightOJ1170 - Counting Perfect BST(卡特兰数)
题目大概就是求一个n个不同的数能构造出几种形态的二叉排序树. 和另一道经典题目n个结点二叉树不同形态的数量一个递推解法,其实这两个问题的解都是是卡特兰数. dp[n]表示用n个数的方案数 转移就枚举第 ...
- LightOj 1170 - Counting Perfect BST (折半枚举 + 卡特兰树)
题目链接: http://www.lightoj.com/volume_showproblem.php?problem=1170 题目描述: 给出一些满足完美性质的一列数(x > 1 and y ...
- HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)
Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...
- 【高精度练习+卡特兰数】【Uva1133】Buy the Ticket
Buy the Ticket Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- Buy the Ticket(卡特兰数+递推高精度)
Buy the Ticket Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- Buy the Ticket HDU 1133 卡特兰数应用+Java大数
Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...
随机推荐
- nginx服务无法停止(Windows)
本人一般停止nginx服务都是通过Windows自带的任务管理器来强制结束nginx进程实现的,如图 2.但是 这次我通过同样的方法来结束nginx服务,发现nginx的进程无法结束 3.首先我要 ...
- python中常⽤的excel模块库
python中常用的excel模块库&安装方法 openpyxl openpyxl是⼀个Python库,用于读取/写⼊Excel 2010 xlsx / xlsm / xltx / xltm⽂ ...
- java 三元运算
一.格式: 数据类型 变量名称 = 条件判断 ? 表达式a : 表达式b; 二.注意: 1.不是打印操作时,需要 三元运算的右则 2.表达式a和表达式b的值,必须要和变量名称 的数据类型相等 貌似和C ...
- OAuth2.0的那点荒唐小秘密 -几个简单概念和原理
OAuth2.0这个名词你是否在项目中时常听到呢?是否觉得好像懂,又好像不太懂呢? 最近一直想写篇关于OAuth2.0的东西,记录下我的学习与感悟,然各种理由的拖延,直到今日才静下心来写下这篇博客.当 ...
- colab上基于tensorflow2.0的BERT中文多分类
bert模型在tensorflow1.x版本时,也是先发布的命令行版本,随后又发布了bert-tensorflow包,本质上就是把相关bert实现封装起来了. tensorflow2.0刚刚在2019 ...
- 为BlueLake主题增加图片放大效果
fancyBox 是一个流行的媒体展示增强组件,可以方便为网站添加图片放大.相册浏览.视频弹出层播放等效果.优点有使用简单,支持高度自定义,兼顾触屏.响应式移动端特性,总之使用体验相当好. 现在,我们 ...
- pikachu漏洞练习之sql注入
这里因为实验的时候只记录了一部分所以就展示一部分 1.1.1数字型注入 (1)看到界面发现是查询id功能,没有在url里看到有传参所以应该是post方法提交数据. (2)进行sql注入之前我们最好是先 ...
- 【转】document.form.action,表单分向提交
document.form.action,表单分向提交,javascript提交表单 同一个表单可以根据用户的选择,提交给不同的后台处理程序.即,表单的分向提交.如,在编写论坛程序时,如果我们希望实现 ...
- 9、python判断语句与循环语句
前言:本文主要介绍python判断语句与循环语句,包括if语句.while循环.for循环.range函数. 一.if语句 关键字:if.elif.else,写法如下: # if if 条件: # ...
- Java Web面试题整理(思维导图)
1,动态网站技术有哪些? 2,一般的Web架构是指BS 还是CS,BS架构是什么咚咚? 3,Web应用程序的流程,即把一个URL串输入地址栏后发生写什么? 4,说一说Servlet生命周期? 5,在W ...