【HNOI模拟By YMD】move
Description
设P(n)为从(0,0)移动到点(n,0)的不同路径数目,移动的方式有以下三种:(x,y)->(x+1,y-1),(x,y)->(x+1,y),(x+y)->(x+1,y+1),并且路径不能和第四象限有交集。求P(n),并对10^9+7取模。
Input
第一行一个整数T,表示数据组数。
对于每组数据,一行一个整数n。
Output
对于每组数据,输出答案。
Data Range
20%:n≤10;
50%:n≤10000;
100%:n≤106,T≤10。
Solution
20%
直接O(3^n*n)的暴力枚举即可。
50%
考虑第一次直线y=0的点,假设是(i,0)。
那么从(1,1)到(i-1,1)之间的路径均在直线y=1的上方,显然有P(i-2)种。同理,从(x,0)到(n,0)之间的路径均在直线y=0的上方,有P(n-i)种。
所以,全部合起来可以得到P(n)=Σni=1 P(i-2)P(n-i),其中,规定P(-1)=P(0)=1。
其实可以在20%基础上打个表,考场有超过5人这样写。。。
100%
假设移动的路径中一共有i个(x,y)->(x+1,y+1),那么就一定会有i个(x,y)->(x+1,y-1),n-2i个(x,y)->(x+1,y)。
而如果不考虑所有的(x,y)->(x+1,y),那么路径的种数就是第i个Catalan数,设为C_i。如果加入(x,y)->(x+1,y),也就是在2i+1个空处中插入n-2i相同的球,方案数是C2in。
所以,P(n)=Σni=1 C_i C2in。
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; typedef long long LL; #define N 1000010
#define MOD 1000000007 int t;
int n; LL f[N],d[N]; inline LL qpow(LL a,LL b)
{
LL ans=;
while (b)
{
if (b&)
ans=(1LL*ans*a)%MOD;
b>>=;
a=(1LL*a*a)%MOD;
}
return ans;
} inline LL C(LL x,LL y)
{
return f[x]*d[y]%MOD*d[x-y]%MOD;
} inline LL Catalan(LL x)
{
return (C(x<<,x)-C(x<<,x-)+MOD)%MOD;
} int main()
{
freopen("move.in","r",stdin);freopen("move.out","w",stdout);
scanf("%d",&t);
f[]=;
for (int i=;i<=;i++)
f[i]=f[i-]*i%MOD;
for (int i=;i<=;i++)
d[i]=qpow(f[i],MOD-)%MOD;
while (t--)
{
scanf("%d",&n);
LL ans=;
for (int i=;i<=n;i+=)
ans+=C(n,i)*Catalan(i>>),ans%=MOD;
printf("%lld\n",ans);
}
return ;
}
【HNOI模拟By YMD】move的更多相关文章
- 3194. 【HNOI模拟题】化学(无标号无根树计数)
Problem 求\(n\)个点的每个点度数不超过\(4\)的无标号无根树个数. Data constraint \(1\le n\le 500\) Solution 尝试着把问题一般化.我们来考虑一 ...
- 【HNOI模拟By lyp】Day2
1 toad1.1 题目描述 有 n 个石子, A B 两人博弈, A 先手. A 首先取若干个石子(至少一个,不能取完),然后B和A 再轮流取石子,每次取的石子不能超过 axb ( x 表示上次取的 ...
- 【HNOI模拟By lyp】Day1
1 xlk1.1 题目描述 给定一棵大小为 n 的无根树,求满足以下条件的四元组 (a, b, c, d) 的个数: 1. 1 ≤ a < b ≤ n 2. 1 ≤ c < d ≤ n 3 ...
- HNOI模拟 Day3.25 By Yqc
怕老婆 [问题描述] 有一天hzy9819,来到了一座大城市拥有了属于他自己的一双滑板鞋.但是他还是不满足想要拥有属于自己的一栋楼,他来到了一条宽敞的大道上,一个一个记录着这些楼的层数以方便自己选择. ...
- HNOI模拟 Day3.23
一.拓扑(top)[ 题目描述]:给你一个有向二分图,求他的拓扑序列的个数.[ 输入]:第一行两个数 N,M,表示点数和边数.接下来 M 行每行两个数 a,b,表示 a 向 b 有一条有向边.[ 输出 ...
- HNOI模拟 Day3.22
第一题: 盾盾的打字机 (drdrd) [题目描述] 盾盾有一个非常有意思的打字机,现在盾哥要用这台打字机来打出一段文章. 由于有了上次的经验,盾盾预先准备好了一段模板 A 存在了内存中,并以此为基础 ...
- Linux命令大全完整版
1. linux系统管理命令 adduser 功能说明:新增用户帐号.语 法:adduser补充说明:在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐 ...
- [置顶] linux常用命令大全
SSH 密令控制台 user/pwd 一:停止tomcat 1,cd .. 进入根目录 2,cd home/ 3,ll 4,cd bin/ 进入tomcat bin目录 5,ll 6,ps -ef | ...
- Linux学习总结(1)——Linux命令大全完整版
Linux命令大全完整版 目 录I 1. linux系统管理命令1 adduser1 chfn(change finger information)1 chsh(change shell)1 d ...
随机推荐
- 原生javascript实现call、apply和bind的方法
var context = {id: 12}; function fun (name, age) { console.log(this.id, name, age) } bind bind() 方法会 ...
- 在你的Android手机上运行Linux
之前试过许多方法(也就几种),像什么Complete Linux Installer,Debian noroot,利用已有的Linux构造Bootstrap之类,要么就是复杂得要命(调了两天没有调出来 ...
- POJ - 2955 Brackets (区间DP)
题目: 给出一个有括号的字符串,问这个字符串中能匹配的最长的子串的长度. 思路: 区间DP,首先枚举区间长度,然后在每一个长度中通过枚举这个区间的分割点来更新这个区间的最优解.还是做的少. 代码: / ...
- 笔试算法题(09):查找指定和值的两个数 & 构造BST镜像树
出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{…i…j…k…m… ...
- 零基础入门学习Python(32)--异常处理:你不可能总是对的
知识点 即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误.运行期检测到的错误被称为异常. 大多数的异常都不会被程序处理,都以错误信息的形式展现在这里: Python标准异常总结 序 ...
- dbeaver能执行存储过程,db2命令编辑器里面不行
- linux命令 iperf-网络性能测试工具
博主推荐:更多网络测试相关命令关注 网络测试 收藏linux命令大全 iperf命令是一个网络性能测试工具.iperf可以测试TCP和UDP带宽质量.iperf可以测量最大TCP带宽,具有多种参数和 ...
- nohup 忽略所有挂断信号
1.nohup 用途:不挂断地运行命令. 语法:nohup Command [ Arg … ] [ & ] 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup ...
- VS2017 + Qt5 + OpenCV400 环境配置
首先为VS2017 IDE点赞. 配置核心 配置 Qt5 和 OpenCV400,最主要的就是头文件路径.库路径以及库文件名字. 配置方法和步骤 新建一个工程,或者打开一个已有的工程: 选择 View ...
- 09-看图理解数据结构与算法系列(B树)
B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数 ...