考虑将两次移动作为一个整体,两次移动的效果分为:$s-u$、$u-s$和原地不动

对于从$s$回到$s$路径,必然有前两种效果使用次数相同,假设都为$i$(枚举),那么原地不动的次数$j=\frac{a+b+c+d}{2}-i$

$2i$次中使用$t$来移动的次数$x$,那么使用$v$的次数即为$y=2i-x$,之后这里有$2i\choose x$种方案(注意这$2i$次操作顺序已经确定,必然是$s-u$再$u-s$循环排列)

考虑原地不动的贡献:在$s$上原地不动的$\frac{a+d}{2}-i$次(这里分子要减去$x+y$,即$2i$)划分为了$i+1$段(可以为空,通过插板法计算),且内部有$\frac{a+d}{2}-i\choose \frac{a-x}{2}$种排列,在$t$上原地不动的类似

综合上述,即$[b+c=0]{a+d\choose a}+\sum_{i=1}^{\frac{a+b+c+d}{2}}\sum_{x=0}^{2i}{2i\choose x}{\frac{a+d}{2}\choose i}{\frac{a+d}{2}-i\choose \frac{a-x}{2}}{\frac{b+c}{2}-1\choose i-1}{\frac{b+c}{2}-i\choose \frac{b-x}{2}}$

对后半部分化简,即$(\frac{a+d}{2})!(\frac{b+c}{2}-1)!\sum_{i=0}^{\frac{a+b+c+d}{2}}\frac{(2i)!}{i!(i-1)!}\sum_{x=0}^{2i}\frac{1}{x!(\frac{a-x}{2})!(\frac{b-x}{2})!(2i-x)!(\frac{d-(2i-x)}{2})!(\frac{c-(2i-x)}{2}))}$

关于$x$的枚举是一个多项式乘法的形式,即记$h(x)=\frac{1}{x!(\frac{a-x}{2})!(\frac{b-x}{2})!}$且$g(x)=\frac{1}{x!(\frac{d-x}{2})!(\frac{c-x}{2})!}$,考虑$f(x)=g(x)h(x)$的$k$次项系数即为$i=\frac{k}{2}$时后面的值,用ntt计算即可,时间复杂度为$o(n\log_{2}n)$(其中$n=a+b+c+d$)

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

[atAGC051D]C4的更多相关文章

  1. 跟我一起数据挖掘(23)——C4.5

    C4.5简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法.它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类.C4.5的目 ...

  2. 【十大经典数据挖掘算法】C4.5

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 决策树模型与学习 决策树(de ...

  3. C4.5算法的学习笔记

    有日子没写博客了,这些天忙着一些杂七杂八的事情,直到某天,老师喊我好好把数据挖掘的算法搞一搞!于是便由再次埋头看起算法来!说起数据挖掘的算法,我想首先不得的不提起的就是大名鼎鼎的由决策树算法演化而来的 ...

  4. C4.5学习及源码阅读

    下面是C4.5源码的下载地址: http://www.rulequest.com/Personal/ 这里先立一个flag,后续更新...... 恕我孤陋寡闻,第一次看到这样的主函数: #includ ...

  5. 数据挖掘算法(一)C4.5

    统计了14天的气象数据D(指标包括outlook,temperature,humidity,windy),并已知这些天气是否打球(play).如果给出新一天的气象指标数据:sunny,cool,hig ...

  6. ID3、C4.5、CART、RandomForest的原理

    决策树意义: 分类决策树模型是表示基于特征对实例进行分类的树形结构.决策树可以转换为一个if_then规则的集合,也可以看作是定义在特征空间划分上的类的条件概率分布. 它着眼于从一组无次序.无规则的样 ...

  7. C4.5,CART,randomforest的实践

    #################################Weka-J48(C4.5)################################# ################### ...

  8. c4,configure the debug environment

    Yesterday I found a tiny C compiler (less than 600 line of C code, containing commits) called " ...

  9. 决策树 -- C4.5算法

    C4.5是另一个分类决策树算法,是基于ID3算法的改进,改进点如下: 1.分离信息   解释:数据集通过条件属性A的分离信息,其实和ID3中的熵:   2.信息增益率   解释:Gain(A)为获的A ...

随机推荐

  1. 从零入门 Serverless | 教你 7 步快速构建 GitLab 持续集成环境

    作者 | 存诚 阿里云弹性计算团队 本文整理自<Serverless 技术公开课>,"Serverless"公众号后台回复"入门",即可获取系列文章 ...

  2. MIPS指令 MIPS架构

    华中科技大学 - 计算机组成原理 华中科技大学 - 计算机硬件系统设计 Microprocessor without Interlocked Pipleline Stages 无内部互锁流水级的微处理 ...

  3. vue.$nextTick实现原理

    源码: const callbacks = [] let pending = false function flushCallbacks () { pending = false const copi ...

  4. Scrum Meeting 0423

    零.说明 日期:2021-4-23 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成引导页UI# ...

  5. [Beta]the Agiles Scrum Meeting 11

    会议时间:2020.5.26 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 帮助解决技术问题 tq 完成评测机新增评测指标 评测部分增加更多评测指标 wjx ...

  6. 【STM32学习笔记】USART 硬件流控

    流控的概念源于 RS232 这个标准,在 RS232 标准里面包含了串口.流控的定义.大家一定了解,RS232 中的"RS"是Recommend Standard 的缩写,即&qu ...

  7. STM32的串口通信

    本篇文章主要讲解一个在开发过程中经常使用到的一个外设---串口. 串口是绝大多数 MCU 中不可或缺的一个外设,同时也是我们开发中经常使用的一种调试手段,所以在STM32的学习中,串口的配置使用也是必 ...

  8. Python爬取COVID-19疫情监控实战

    一.项目概述 本项目基于Python.Flask.Echarts打造的一个疫情监控系统,涉及技术: Python网络爬虫 Python与Mysql数据库交互 使用Flask构建web项目 基于Echa ...

  9. Python课程笔记(七)

    今天学习神奇的海龟,非常有意思,还有很多图片想去绘制,分享一个turtle绘图网站: https://www.python123.io/index/turtles/latest , 要是可以分享出源码 ...

  10. 数字设计中的时钟与约束(gate)

    转载:https://www.cnblogs.com/IClearner/p/6440488.html 最近做完了synopsys的DC workshop,涉及到时钟的建模/约束,这里就来聊聊数字中的 ...