[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, ...
随机推荐
- Bate敏捷冲刺每日报告--day3
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...
- C语言——第六周作业
题目 题目一:高速公路超速处罚 1.实验代码 #include <stdio.h> int main() { int speed,maxspeed; double x; scanf(&qu ...
- 玩转Leveldb原理及源码--拙见1
可以说是不知天高地厚.. 可以说是班门弄斧.. 但是,我今天还就这样走了,我喜欢!!!!!! 注:后续文章,限于篇幅,不懂名词都有 紫色+下划线 超链接,有兴趣,可以查阅: 网上关于Leveldb 的 ...
- JAVA_SE基础——54.异常
异常的体系: ----------| Throwable 所以异常或者错误类的超类 --------------|Error 错误 错误一般是用于jvm或者是硬件引发的问题,所以我们一般不会通 ...
- LeetCode & Q27-Remove Element-Easy
Array Two Pointers Description: Given an array and a value, remove all instances of that value in pl ...
- 鼠标滑过切换div显示(鼠标事件)
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- kubernetes入门(08)kubernetes单机版的安装和使用
kubectl get - 类似于 docker ps ,查询资源列表 kubectl describe - 类似于 docker inspect ,获取资源的详细信息 kubectl logs - ...
- 新概念英语(1-123)A trip to Australia
Who is the man with the beard?(胡须)A:Look, Scott. This is a photograph I took during my trip to Austr ...
- Linux实战案例(6)yum查找、卸载、和安装软件
0.查找要安装的软件名字 yum search iostat就能查到以及iostat相干的安装包了, 别的想安装一个程序,只记得一部门名称,也可以用这个措施来实现安装 yum search png | ...
- Jetty入门(1-2)eclipse集成jetty插件并发布运行应用
一.eclipse集成jetty插件 1.从市场安装jetty插件 2.使用jetty插件发布应用和配置运行环境 debug配置默认共用上述run配置 3.使用jetty插件启动运行和停止运行选中的应 ...