[HZOI 2015]疯狂的机器人
【题目描述】
现在在二维平面内原点上有一只机器人
他每次操作可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格)
但是由于本蒟蒻施展的大魔法,机器人不能走到横坐标是负数或者纵坐标是负数的点上
否则他就会big bang
给定操作次数n,求有多少种不同的操作序列使得机器人在操作后会回到原点
输出答案模998244353后的结果
注意如果两个操作序列存在某一时刻操作不同,则我们认为这两个操作序列不同
【输入格式】
输入n,表示操作次数
n<=100000
【输出格式】
按要求输出答案
【样例输入】
3
【样例输出】
7
【提示】
样例解释:
机器人有7种操作序列
1、不走 不走 不走
2、不走 向右 向左
3、向右 不走 向左
4、向右 向左 不走
5、不走 向上 向下
6、向上 不走 向下
7、向上 向下 不走
将操作分3类:向上下,向左右,不动
$f[i]$表示只考虑前两类走i步到原点的方案数
$$f[n]=\sum_{i=0}^{n}a[i]*a[n-i]*\binom{n}{i}$$
$a[i]$表示向上向下(或向左向右)走i步回到原点的方案数
显然i为偶数时才有方案否则$a[i]$为0
然后不动就直接枚举f
$$ans=\sum_{i=0}^{n}f[i]*\binom{n}{i}$$
$a[i]$显然就是卡特兰数第$i/2$项
因为任意时刻向上的前缀和总是大于向下的
至于卷积就直接把组合数拆开,把分母分到a上,即:
$$a[i]=C[i/2]*i!^{-1}$$
NTT求出f后再乘上$n!$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef int lol;
const int N=;
int Mod=;
int G=;
int a[*N],fac[*N],R[*N],ifac[*N],inv[*N],c[*N],f[*N],ans;
int qpow(int x,int y)
{
int res=;
while (y)
{
if (y&) res=1ll*res*x%Mod;
x=1ll*x*x%Mod;
y>>=;
}
return res;
}
void NTT(int *A,int len,int o)
{int wn,w,i,j,k,x,y;
for (i=;i<len;i++)
if (i<R[i]) swap(A[i],A[R[i]]);
for (i=;i<len;i<<=)
{
wn=qpow(G,(Mod-)/(i<<));
if (o==-) wn=qpow(wn,Mod-);
for (j=;j<len;j+=(i<<))
{
w=;
for (k=;k<i;k++,w=1ll*w*wn%Mod)
{
x=A[j+k];y=1ll*w*A[j+k+i]%Mod;
A[j+k]=x+y;
if (A[j+k]>=Mod) A[j+k]-=Mod;
A[j+k+i]=x-y;
if (A[j+k+i]<) A[j+k+i]+=Mod;
}
}
}
if (o==-)
{
int tmp=qpow(len,Mod-);
for (i=;i<len;i++)
A[i]=1ll*A[i]*tmp%Mod;
}
}
int main()
{
int i,len,lg,n;
scanf("%d",&n);
memset(a,,sizeof(a));
fac[]=fac[]=ifac[]=ifac[]=inv[]=;
for (i=;i<=n*;i++)
{
inv[i]=1ll*(Mod-Mod/i)*inv[Mod%i]%Mod;
fac[i]=1ll*fac[i-]*i%Mod;
ifac[i]=1ll*ifac[i-]*inv[i]%Mod;
}
for (i=;i<=n;i++)
c[i]=1ll*fac[i<<]*ifac[i]%Mod*ifac[i]%Mod*inv[i+]%Mod;
a[]=;
for (i=;i<=n;i++)
if ((i&)==)
a[i]=1ll*c[i>>]*ifac[i]%Mod;
len=;
while (len<=*n) len*=,lg++;
for (i=;i<len;i++)
R[i]=(R[i>>]>>)|((i&)<<(lg-));
NTT(a,len,);
for (i=;i<len;i++)
a[i]=1ll*a[i]*a[i]%Mod;
NTT(a,len,-);
for (i=;i<=n;i++)
f[i]=1ll*a[i]*fac[i]%Mod;
for (i=;i<=n;i++)
ans=1ll*(ans+1ll*f[i]*fac[n]%Mod*ifac[i]%Mod*ifac[n-i]%Mod)%Mod;
printf("%d\n",ans);
return ;
}
[HZOI 2015]疯狂的机器人的更多相关文章
- BZOJ 2287. [HZOI 2015]疯狂的机器人 [FFT 组合计数]
2287. [HZOI 2015]疯狂的机器人 题意:从原点出发,走n次,每次上下左右不动,只能在第一象限,最后回到原点方案数 这不煞笔提,组合数写出来发现卷积NTT,然后没考虑第一象限gg 其实就是 ...
- 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合
[题意][COGS 2287][HZOI 2015]疯狂的机器人 [算法]FFT+卡特兰数+排列组合 [题解]先考虑一维的情况,支持+1和-1,前缀和不能为负数,就是卡特兰数的形式. 设C(n)表示第 ...
- [COGS 2287][HZOI 2015]疯狂的机器人
Description 题库链接 现在在二维平面内原点上有一只机器人,他每次可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格).机器人不能走到横坐标是负数或者纵坐标是负数的点上. 给 ...
- COGS2287 [HZOI 2015]疯狂的机器人
[题目描述] 现在在二维平面内原点上有一只机器人 他每次操作可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格) 但是由于本蒟蒻施展的大魔法,机器人不能走到横坐标是负数或者纵坐标是负数 ...
- cojs 疯狂的重心 疯狂的机器人 题解报告
疯狂的重心 话说做过幻想乡战略游戏的人应该很容易切掉这道题目吧 我们考虑一棵树如果添加了一个叶子,那么其重心最多向叶子方向移动1的距离 而是否移动我们只需要记录子树中有多少个点就可以判断啦 也就是说这 ...
- Bitset([HZOI 2015]偏序++)
Bitset简介 下面介绍C++ STL 中一个非常有用的东西: Bitset 类似于二进制状压,它可以把信息转化成一个01串存储起来 定义方法: 首先要#include<bitset>或 ...
- [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树
[cogs2314][HZOI 2015]Persistable Editor - 可持久化平衡树 题目链接 首先吐槽扯淡几句 [题目描述] 维护一种可持久化的文本编辑器,支持下列操作: 1 p st ...
- cogs 2123. [HZOI 2015] Glass Beads
2123. [HZOI 2015] Glass Beads ★★★ 输入文件:MinRepresentations.in 输出文件:MinRepresentations.out 简单对比时 ...
- COGS 2580. [HZOI 2015]偏序 II
COGS 2580. [HZOI 2015]偏序 II 题目传送门 题目大意:给n个元素,每个元素有具有4个属性a,b,c,d,求i<j并且ai<aj,bi<bj,ci<cj, ...
随机推荐
- 第2次作业:Wechat创作史
Wechat创作史 比尔盖茨曾经说过一句话:21世纪要么电子商务,要么无商可务. 2.1 介绍产品相关信息 -the information about Wechat 你选择的产品是? 选择微信作 ...
- 敏捷冲刺(Beta版本)
评分基准: 按时交 - 有分(计划安排-10分,敏捷冲刺-70分),检查的项目包括后文的三个个方面 冲刺计划安排(单独1篇博客,基本分5分,根据完成质量加分,原则上不超过满分10分) 七天的敏捷冲刺( ...
- Beta阶段报告
Beta版测试报告 1. 在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? BUG名 修复的BUG 不能重现的BUG 非BUG 没能力修复的BUG 下个版本修复 url乱码 √ 手机端 ...
- WORK
团队展示 队伍信息 队名:小狗队 队长:刘映华(201421122021) 队员:兰运良(201421122030).郭和水(201421122017) 团队项目描述 团队项目描述是基于之前的四则运算 ...
- MariaDB/MySQL存储过程和函数
本文目录:1.创建存储过程.函数 1.1 存储过程的IN.OUT和INOUT2.修改和删除存储过程.函数3.查看存储过程.函数信息 在MySQL/MariaDB中,存储过程(stored proced ...
- 前端面试题:JS中的let和var的区别
最近很多前端的朋友去面试被问到let和var的区别,其实阮一峰老师的ES6中已经很详细介绍了let的用法和var的区别.我简单总结一下,以便各位以后面试中使用. ES6 新增了let命令,用来声明局部 ...
- JS 转换数据类型
JavaScript 是一种动态数据类型语言,变量是没有类型的,可以随机赋予任意值,若变量要转换数据类型,有两种办法:隐式转换和显式转换. 隐式转换可转换为字符串(将一个值加上字符串) 数字(在值的前 ...
- phalcon环境的搭建和dll扩展下载与选择
phalcon需要下载一个扩展的dll文件才能运行项目 其中需要注意dll放在一个php扩展目录中windows下php/ext/,还需要在两个Php.ini文件中增加扩展说明,一般只需要更改 D:\ ...
- 区间的连续段~ST表(模板题)
链接:https://www.nowcoder.com/acm/contest/82/B来源:牛客网 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 算法题丨3Sum Closest
描述 Given an array S of n integers, find three integers in S such that the sum is closest to a given ...