HZOJ 题
首先对于n<=100的点,直接暴力dp,f[i][j][k]表示时间为i,在i,j位置的方案数,枚举转移即可,期望得分40。
if(n<=)
{
if(t==)
{
f[][][]=;
for(int i=;i<=n;i++)
for(int x=;x<=;x++)
for(int y=;y<=;y++)
f[i][x][y]=((f[i-][x-][y]+f[i-][x+][y])%mod+(f[i-][x][y-]+f[i-][x][y+])%mod)%mod;
printf("%d\n",f[n][][]);
return ;
}
if(t==)
{
f[][][]=;
for(int i=;i<=n;i++)
for(int x=;x<=;x++)
f[i][x][]=(f[i-][x-][]+f[i-][x+][])%mod;
printf("%d\n",f[n][][]);
return ;
}
if(t==)
{
f[][][]=;
for(int i=;i<=n;i++)
for(int x=;x<=;x++)
for(int y=;y<=;y++)
if(x==||y==)
f[i][x][y]=((f[i-][x-][y]+f[i-][x+][y])%mod+(f[i-][x][y-]+f[i-][x][y+])%mod)%mod;
printf("%d\n",f[n][][]);
return ;
}
if(t==)
{
f[][][]=;
for(int i=;i<=n;i++)
for(int x=;x<=n+;x++)
for(int y=;y<=n+;y++)
f[i][x][y]=((f[i-][x-][y]+f[i-][x+][y])%mod+(f[i-][x][y-]+f[i-][x][y+])%mod)%mod;
printf("%d\n",f[n][][]);
return ;
}
}
代码实现
type0:这里
type1:显然卡特兰数……
type2:居然是个dp
f[i]表示走了i步回到原点的方案数,枚举第一次回到原点时走过的步数j(为了存在合法解,j为偶数),则此时方案数为f[i-j]*catalan(j/2-1),复杂度为O(n^2)所以最大范围只出到1000.
type3:
枚举横向移动了多少步.横向移动i步时(为了存在合法解,i必须是偶数),方案数为C(n,i)*catalan(i/2)*catalan((n-i)/2)
可以这样考虑:横向移动了i步,因为只能在第一象限,所以横向是一个卡特兰数,同理纵向也是一个卡特兰数。
#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
using namespace std;
const int mod=1e9+;
int n,t;
int f[][][];
LL f1[];
LL jc[];
LL poww(LL a,int b,int mod)
{
LL ans=;
while(b)
{
if(b&)ans=ans*a%mod;
a=a*a%mod;
b=b>>;
}
return ans;
}
LL C(int n,int m)
{
if(m>n)return ;
if(!m)return ;
return jc[n]*poww(jc[m],mod-,mod)%mod*poww(jc[n-m],mod-,mod)%mod;
}
LL H(int i)
{
return C(*i,i)*poww(i+,mod-,mod)%mod;
}
inline int read();
signed main()
{
n=read(),t=read();
if(n<=)
{
if(t==)
{
f[][][]=;
for(int i=;i<=n;i++)
for(int x=;x<=;x++)
for(int y=;y<=;y++)
f[i][x][y]=((f[i-][x-][y]+f[i-][x+][y])%mod+(f[i-][x][y-]+f[i-][x][y+])%mod)%mod;
printf("%d\n",f[n][][]);
return ;
}
if(t==)
{
f[][][]=;
for(int i=;i<=n;i++)
for(int x=;x<=;x++)
f[i][x][]=(f[i-][x-][]+f[i-][x+][])%mod;
printf("%d\n",f[n][][]);
return ;
}
if(t==)
{
f[][][]=;
for(int i=;i<=n;i++)
for(int x=;x<=;x++)
for(int y=;y<=;y++)
if(x==||y==)
f[i][x][y]=((f[i-][x-][y]+f[i-][x+][y])%mod+(f[i-][x][y-]+f[i-][x][y+])%mod)%mod;
printf("%d\n",f[n][][]);
return ;
}
if(t==)
{
f[][][]=;
for(int i=;i<=n;i++)
for(int x=;x<=n+;x++)
for(int y=;y<=n+;y++)
f[i][x][y]=((f[i-][x-][y]+f[i-][x+][y])%mod+(f[i-][x][y-]+f[i-][x][y+])%mod)%mod;
printf("%d\n",f[n][][]);
return ;
}
}
else
{
LL ans=;
jc[]=;for(int i=;i<=;i++)jc[i]=jc[i-]*i%mod;
if(t==)
{
int s,x,z,y;
for(s=;s<=n/;s++)
{
x=s;z=y=(n-s-x)/;
ans=(ans+jc[n]*poww(jc[s],mod-,mod)%mod*poww(jc[x],mod-,mod)%mod*poww(jc[z],mod-,mod)%mod*poww(jc[y],mod-,mod)%mod)%mod;
}
printf("%lld\n",ans%mod);
return ;
}
if(t==)
{
n=n/;ans=;
for(int i=n+;i<=*n;i++)ans=ans*i%mod;
ans=ans*poww(jc[n],mod-,mod);
printf("%lld\n",ans%mod);
return ;
}
if(t==)
{
f1[]=;
for(int i=;i<=n;i+=)
for(int j=;j<=i;j+=)
f1[i]=(f1[i]+*f1[i-j]*H(j/-)%mod)%mod;
printf("%lld\n",f1[n]%mod);
return ;
}
if(t==)
{
for(int i=;i<=n;i+=)
ans=(ans+C(n,i)*H(i/)%mod*H((n-i)/)%mod)%mod;
printf("%lld\n",ans);
return ;
}
}
}
inline int read()
{
int s=;char a=getchar();
while(a<''||a>'')a=getchar();
while(a>=''&&a<=''){s=s*+a-'';a=getchar();}
return s;
}
暴力和正解全在这里!!
HZOJ 题的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170105
20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170104
20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170103
20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- SQL面试笔试经典题(Part 1)
本文是在Cat Qi的原贴的基础之上,经本人逐题分别在MySql数据库中实现的笔记,持续更新... 参考原贴:http://www.cnblogs.com/qixuejia/p/3637735.htm ...
- 刷LeetCode的正确姿势——第1、125题
最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的 ...
- AWS的SysOps认证考试样题解析
刚考过了AWS的developer认证,顺手做了一下SysOps的样题.以下是题目和答案. When working with Amazon RDS, by default AWS is respon ...
- AWS开发人员认证考试样题解析
最近在准备AWS的开发人员考试认证.所以特意做了一下考试样题.每道题尽量给出了文档出处以及解析. Which of the following statements about SQS is true ...
随机推荐
- 解决底部Button遮挡ListView最后一项内容的bug
项目中ListView和Button经常是一起使用的,用ListView来展示数据,用Button来提交修改的数据或对修改的数据进行确定操作. 假如使用线性布局的话ListView会盖住整个Butto ...
- GIT → 04:Git与代码托管平台
4.1 Git 与 GitHub比较 Git 是一个版本管理工具 , 只在本地使用的一个版本管理工具,其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,后面虽然修改过,但是通过git这个工 ...
- ucore 物理内存探测 lab2 附录A&B
探测物理内存分布的大小和方法 bootloader 增加的工作 bootasm.S 中对应了 probe_memory 到 finish_probe 的部分. 通过BIOS 中断 获取内存可调用参数为 ...
- 2018-8-10-如何使用-C#-爬虫获得专栏博客更新排行
title author date CreateTime categories 如何使用 C# 爬虫获得专栏博客更新排行 lindexi 2018-08-10 19:16:51 +0800 2018- ...
- CodeVS3958 火车进站
3958 火车进站 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 火车站内往往设有一些主干线分叉出去的铁路支路 ...
- Leetcode46. Permutations全排列
给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1 ...
- ue4 fstring 和std::string互转
https://forums.unrealengine.com/development-discussion/c-gameplay-programming/6517-convert-std-strin ...
- C++ operator new和new operator的区别
new operator 当你写这种代码: string *ps = new string("Memory Management"); 你使用的new是new operator. ...
- WPF e.Systemkey的一个坑
当用代码去控制按键盘F10按钮的时候,切换TabControl的标签页,然后再按其余的键盘键,无法响应 原因就是这个systemkey,是因为F10为系统的按键,用e.key==key.f10是无效的 ...
- 世界名校网络课程大盘点,美国大学CS专业十三大研究方向,世界50所知名大学提供开放课程
世界名校网络课程大盘点 加州大学伯克利分校http://webcast.berkeley.edu/ 加州大学伯克利分校与斯坦福大学. 麻省理工学院等一同被誉为美国工程科技界的学术 领袖,其常年位居 ...