为了方便,不妨先将$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. Redis 基础数据类型重温

    有一天你突然收到一条线上告警:Redis 内存使用率 85%.你吓坏了赶紧先进行扩容然后再去分析 big key.等你进行完这一系列操作之后老板叫你去复盘,期间你们聊到了业务的数据存储在 Redis ...

  2. hadoop学习笔记:运行wordcount对文件字符串进行统计案例

    文/朱季谦 我最近使用四台Centos虚拟机搭建了一套分布式hadoop环境,简单模拟了线上上的hadoop真实分布式集群,主要用于业余学习大数据相关体系. 其中,一台服务器作为NameNode,一台 ...

  3. 分享一份软件测试项目实战(web+app+h5+小程序)

    大家好,我是谭叔. 本次,谭叔再度出马,给大家找了一个非常适合练手的软件测试项目,此项目涵盖web端.app端.h5端.小程序端,可以说非常之全面. 缘起 在这之前,谭叔已经推出了九套实战教程. 但是 ...

  4. [Java]Sevlet

    0 前言 对于Java程序员而言,Web服务器(如Tomcat)是后端开发绕不过去的坎.简单来看,浏览器发送HTTP请求给服务器,服务器处理后发送HTTP响应给浏览器. Web服务器负责对请求进行处理 ...

  5. Java多线程中的死锁

    Java多线程中的死锁 死锁产生的原因 线程死锁是指由两个以上的线程互相持有对方所需要的资源,导致线程处于等待状态,无法往前执行. 当线程进入对象的synchronized代码块时,便占有了资源,直到 ...

  6. 2020BUAA软工个人项目作业

    2020BUAA软工个人项目作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 学 ...

  7. Python课程笔记(三)

    1.python定义类.创建对象 class Myclass: # 定义Myclass类 def sum(self,x,y): self.x = x self.y = y return self.x+ ...

  8. JavaScript中的this对象指向理解

    在JavaScript中,this不是固定不变的,它的指向取决于上下文环境,一般的,认为this指向使用它时所在的对象.主要有以下几类指向: 在方法中,this 表示该方法所属的对象. 如果单独使用, ...

  9. 数组中只出现过一次的数字 牛客网 剑指Offer

    数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...

  10. OAuth 2.0 的探险之旅

    前言 OAuth 2.0 全称是 Open Authorization 2.0, 是用于授权(authorization)的行业标准协议. OAuth 2.0 专注于客户端开发人员的简单性,同时为 W ...