考虑将两次移动作为一个整体,两次移动的效果分为:$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. 感恩笔记之SQL语句操纵数据集基本功能模板

    SQL查询_基本功能 一 SQL语句整体架构 SELECT --1 查询数据表 INTO --2 新建数据表 FROM --3 查询数据表 WHERE --4 筛选数据表 ORDER BY --5 排 ...

  2. 深入理解Java虚拟机之JVM内存布局篇

    内存布局**** ​ JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的稳定高效运行.不同的JVM对于内存的划分方式和管理机制存在部分差异.结合JVM虚拟机规范,一起来 ...

  3. The Data Way Vol.3|做到最后只能删库跑路?DBA 能做的还有很多

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  4. C chdir函数

    chdir微软官方文档 在制作小游戏时遇到的问题:图片音频等资源文件太多,和exe同一个目录不方便集中管理 整理方案1 首先创建了一个名为"resource"的文件夹,把程序执行过 ...

  5. HCNP Routing&Switching之BGP邻居建立条件、优化和认证

    前文我们了解了BGP相关概念.AS相关概念以及BGP邻居类型.基础配置等,相关回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15370838.html:今天我们 ...

  6. centos7谷歌chrome内网部署演示

    上传需要的包,注释网关创建内网环境 [root@localhost ~]# ls anaconda-ks.cfg chrome mcw4 mcw4.tar.gz mcwchromerpm.tar.gz ...

  7. Java(7)流程控制语句中的for、while、do while循环

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201543.html 博客主页:https://www.cnblogs.com/testero ...

  8. Markdown Reference

    Markdown For Typora Overview Markdown is created by Daring Fireball; the original guideline is here. ...

  9. Object.create 和 Object.assign

    Object.assign(target, ...source) 1.Object.assign方法只会拷贝源对象自身(不包括原型)的并且可枚举的属性到目标对象,使用源对象的get和目标对象的set, ...

  10. python jinja2初见

    吸取了长城杯的教训,学习python-web迫在眉睫. 正常难度的python_template_injection,由于现在没学面向对象,理解原理比较困难,所以先使用简单版复现:并附上正常版的常用p ...