为了方便,不妨先将$n$和$m$都减小1,其意义即为移动的次数

注意到老鼠向下移动和猫向上移动对于第2个条件是等价的,对于第1个条件即要求都恰好移动$n$次,那么对应的方案数即为${2n\choose n}$,乘上此系数后不妨将两种操作都看作仅有老鼠向下移动$2n$次

此时,即猫只能向右移动,因此相遇的位置必然在第$n+1$行

定义$f(x)$表示双方最终位于$(n+1,x+1)$且不存在一次操作后双方在同一个位置上的方案数,枚举双方相遇的位置,不难得到答案即为${2n\choose n}\sum_{i=0}^{m}f(i)f(m-i)$

先不考虑不在同一个位置上的条件,总方案数即为${n+2x\choose x}{n+x\choose n}$,将其记作$g(x)$,对于不合法的方案不妨去枚举其上一次相遇的位置,此时限制即之后不再相遇

具体的,可以看作在坐标系中从$(0,0)$走到$(n,0)$,每一步可以从$(x,y)$移动到$(x+1,y\pm 1)$,求除了起点和终点以外不与$x$轴有公共点的路径数

不难发现这即为$2H_{n-1}$(其中$H$为卡特兰数),也即有$f(x)=g(x)-2\sum_{i=0}^{x-1}H_{x-i-1}g(i)$

时间复杂度为$o(n+m\log m)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 600005
4 #define L (1<<19)
5 #define mod 998244353
6 #define ll long long
7 int n,m,ans,fac[N],inv[N],rev[L],a[L],b[L],g[N],f[N];
8 int C(int n,int m){
9 return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;
10 }
11 int qpow(int n,int m){
12 int s=n,ans=1;
13 while (m){
14 if (m&1)ans=(ll)ans*s%mod;
15 s=(ll)s*s%mod;
16 m>>=1;
17 }
18 return ans;
19 }
20 void ntt(int *a,int p){
21 for(int i=0;i<L;i++)
22 if (i<rev[i])swap(a[i],a[rev[i]]);
23 for(int i=2;i<=L;i<<=1){
24 int s=qpow(3,(mod-1)/i);
25 if (p)s=qpow(s,mod-2);
26 for(int j=0;j<L;j+=i)
27 for(int k=0,ss=1;k<(i>>1);k++,ss=(ll)ss*s%mod){
28 int x=a[j+k],y=(ll)a[j+k+(i>>1)]*ss%mod;
29 a[j+k]=(x+y)%mod,a[j+k+(i>>1)]=(x-y+mod)%mod;
30 }
31 }
32 if (p){
33 int s=qpow(L,mod-2);
34 for(int i=0;i<L;i++)a[i]=(ll)a[i]*s%mod;
35 }
36 }
37 int main(){
38 scanf("%d%d",&n,&m);
39 n--,m--;
40 fac[0]=inv[0]=inv[1]=1;
41 for(int i=1;i<N;i++)fac[i]=(ll)fac[i-1]*i%mod;
42 for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
43 for(int i=1;i<N;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod;
44 for(int i=0;i<L;i++)rev[i]=(rev[i>>1]>>1)+((i&1)*(L>>1));
45 for(int i=0;i<=m;i++)a[i]=g[i]=(ll)C(n+(i<<1),i)*C(n+i,n)%mod;
46 for(int i=0;i<m;i++)b[i+1]=(ll)C((i<<1),i)*fac[i]%mod*inv[i+1]%mod;
47 ntt(a,0),ntt(b,0);
48 for(int i=0;i<L;i++)a[i]=(ll)a[i]*b[i]%mod;
49 ntt(a,1);
50 for(int i=0;i<=m;i++)f[i]=(g[i]-2*a[i]%mod+mod)%mod;
51 for(int i=0;i<=m;i++)ans=(ans+(ll)f[i]*f[m-i])%mod;
52 ans=(ll)ans*C((n<<1),n)%mod;
53 printf("%d\n",ans);
54 return 0;
55 }

[atARC124F]Chance Meeting的更多相关文章

  1. [LeetCode] Best Meeting Point 最佳开会地点

    A group of two or more people wants to meet and minimize the total travel distance. You are given a ...

  2. [LeetCode] Meeting Rooms II 会议室之二

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  3. [LeetCode] Meeting Rooms 会议室

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  4. Scrum Meeting 20161205

    本周Sprint Master 史少帅 一. 会议概要 作为一个新的sprint的开端,本次scrum meeting总结了每个人过去以来的工作,并明确了下一步的计划,具体如下: 工作总结: · 陈双 ...

  5. Beta阶段第十次Scrum Meeting

    情况简述 BETA阶段第十次Scrum Meeting 敏捷开发起始时间 2017/1/4 00:00 敏捷开发终止时间 2017/1/5 00:00 会议基本内容摘要 deadline到来 参与讨论 ...

  6. Beta阶段第九次Scrum Meeting

    情况简述 BETA阶段第九次Scrum Meeting 敏捷开发起始时间 2017/1/2 00:00 敏捷开发终止时间 2017/1/3 00:00 会议基本内容摘要 deadline临近 参与讨论 ...

  7. Beta阶段第八次Scrum Meeting

    情况简述 BETA阶段第八次Scrum Meeting 敏捷开发起始时间 2016/12/21 00:00 敏捷开发终止时间 2016/12/22 00:00 会议基本内容摘要 deadline临近 ...

  8. Beta阶段第七次Scrum Meeting

    Beta阶段第七次Scrum Meeting 情况简述 BETA阶段第七次Scrum Meeting 敏捷开发起始时间 2016/12/20 00:00 敏捷开发终止时间 2016/12/21 00: ...

  9. Beta阶段第六次Scrum Meeting

    情况简述 BETA阶段第六次Scrum Meeting 敏捷开发起始时间 2016/12/16 00:00 敏捷开发终止时间 2016/12/17 00:00 会议基本内容摘要 平稳推进 参与讨论人员 ...

随机推荐

  1. 专访阿里云 Serverless 负责人:无服务器不会让后端失业

    2012 年,云基础设施服务提供商 Iron.io 的副总裁 Ken 谈到软件开发行业的未来,首次提出了 Serverless 的概念,为云中运行的应用程序描述了一种全新的系统体系架构.此后,以 AW ...

  2. ssh 批量免密登陆

    SSH第一次连接远程主机 公钥交换原理 1.客户端发起链接请求2.服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)3.客户端生成密钥对4.客户端用自己的公钥异或会话ID,计算出一个 ...

  3. bzoj1341 名次排序问题rank sorting(dp,考虑到对未来的贡献)

    QWQ啊 这个题可以说是我目前碰到过的最难理解的dp之一了. 题目大意: 已知参赛选手的得分,你的任务是按照得分从高到底给出选手的排名.遗憾的是,保存选手信息的数据结构只支持 一种操作,即将一个选手从 ...

  4. 「软件测试实战教程系列(三)」弃繁就简,接口测试神器Postman|收藏版

    软件测试实战教程系列(三)弃繁就简,接口测试神器Postman|收藏版 Postman主要帮我们干了三件事: 1.把相关集合放到一个集合当中方便管理. 2.对指定接口发送请求. 3.断言 下面我们使用 ...

  5. Hive面试题整理(一)

    1.Hive表关联查询,如何解决数据倾斜的问题?(☆☆☆☆☆)   1)倾斜原因:map输出数据按key Hash的分配到reduce中,由于key分布不均匀.业务数据本身的特.建表时考虑不周.等原因 ...

  6. 【c++ Prime 学习笔记】第5章 语句

    C++提供了一组控制流语句,包括条件执行语句.循环语句.跳转语句. 5.1 简单语句 空语句 ; ,最简单的语句 别漏写分号,也别多写 while(cin>>s && s! ...

  7. activiti会签 多实例例子

    在实际的业务中,可能存在存在这么一种情况,当流程运行到某一个环节时,可能需要同时多个人的参与,才可以完成此环节.此时就可以用到activiti的多实例来解决此问题. 一.将一个节点设置成多实例的方法: ...

  8. Noip模拟69 2021.10.5

    考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...

  9. 状压dp学习笔记(紫例题集)

    P3451旅游景点 Tourist Attractions 这个代码其实不算是正规题解的(因为我蒟蒻)是在我们的hzoj上内存限制324MIB情况下过掉的,而且经过研究感觉不太能用滚动数组,所以那这个 ...

  10. csp-s 2021

    T1 廊桥分配 当一架飞机抵达机场时,可以停靠在航站楼旁的廊桥,也可以停靠在位于机场边缘的远机位. 乘客一般更期待停靠在廊桥,因为这样省去了坐摆渡车前往航站楼的周折. 然而,因为廊桥的数量有限,所以这 ...