[atAGC051D]C4
考虑将两次移动作为一个整体,两次移动的效果分为:$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的更多相关文章
- 跟我一起数据挖掘(23)——C4.5
C4.5简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法.它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类.C4.5的目 ...
- 【十大经典数据挖掘算法】C4.5
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 决策树模型与学习 决策树(de ...
- C4.5算法的学习笔记
有日子没写博客了,这些天忙着一些杂七杂八的事情,直到某天,老师喊我好好把数据挖掘的算法搞一搞!于是便由再次埋头看起算法来!说起数据挖掘的算法,我想首先不得的不提起的就是大名鼎鼎的由决策树算法演化而来的 ...
- C4.5学习及源码阅读
下面是C4.5源码的下载地址: http://www.rulequest.com/Personal/ 这里先立一个flag,后续更新...... 恕我孤陋寡闻,第一次看到这样的主函数: #includ ...
- 数据挖掘算法(一)C4.5
统计了14天的气象数据D(指标包括outlook,temperature,humidity,windy),并已知这些天气是否打球(play).如果给出新一天的气象指标数据:sunny,cool,hig ...
- ID3、C4.5、CART、RandomForest的原理
决策树意义: 分类决策树模型是表示基于特征对实例进行分类的树形结构.决策树可以转换为一个if_then规则的集合,也可以看作是定义在特征空间划分上的类的条件概率分布. 它着眼于从一组无次序.无规则的样 ...
- C4.5,CART,randomforest的实践
#################################Weka-J48(C4.5)################################# ################### ...
- c4,configure the debug environment
Yesterday I found a tiny C compiler (less than 600 line of C code, containing commits) called " ...
- 决策树 -- C4.5算法
C4.5是另一个分类决策树算法,是基于ID3算法的改进,改进点如下: 1.分离信息 解释:数据集通过条件属性A的分离信息,其实和ID3中的熵: 2.信息增益率 解释:Gain(A)为获的A ...
随机推荐
- Java集合——List,Set,Map总结笔记
1. 集合 Collection 1.1 Java 集合框架 Java 集合框架位于 java.util 包中.Java 集合框架主要包括两种类型的容器,一种是集合(C ...
- 地形鞍部的提取(ArcPy实现)
1.背景 相邻两山头之间呈马鞍形的低凹部分称为鞍部.鞍部点是重要的地形控制点,它和山顶点.山谷点及山脊线.山谷线等构成地形特征点线,对地形具有很强的控制作用.因此,因此,对这些地形特征点.线的分析研究 ...
- 洛谷3244 落忆枫音 (拓扑图dp+式子)
题目大意就是 给你一个DAG 然后添加一条边\(x->y\) ,询问以1为根的生成树的个数 QWQ 首先假设没有添加的边 答案就应该是 \[ans=\prod_{i=1}^{n} in[i] \ ...
- luogu1081 开车旅行2012 D1T3 (倍增,set,O2)
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i ...
- 2020.4.6--UCF Local Programming Contest 2017的正式赛
Problem A : Electric Bill 题目大意:进行电量分级制收费,1000kwh及以下一档收费,1000kwh以上按另一档收费,给出每个人的电量总额,问每人应支付多少钱. 思路:基础i ...
- Frida-RPC调用
Python Frida RPC 调用示例 JS_CODE var base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrs ...
- 初学Python “登录”案例 更新!!
更新内容:添加了登录次数,如果超过限制的次数,则提示账户被锁定,去某邮箱申请解锁账户! 此次仅把登录系统更新之后源代码放到这里,不在共享源文件在网盘了! 1 ''' 2 登录界面 3 ''' 4 5 ...
- 微软Windows11安卓子系统已支持运行APK 应用(附手把手详细安装攻略)怎么安装安卓/如何安装安卓应用/支持多窗口多任务
10 月 21 日消息,微软博客宣称,Windows 11 上 安卓子系统运行 Android 应用程序的第一个预览版现已提供给美国 Beta 频道的 Windows 内部人员.但现在通过教程 ...
- 【UE4 C++ 基础知识】<10>资源的引用
2种引用方式 硬引用(Hard Reference) 即对象 A 引用对象 B,并导致对象 B 在对象 A 加载时加载 硬引用过多会导致运行时很多暂时用不到的资源也被加载到内存中 大量资源会导致进程阻 ...
- 2019OO第四单元作业总结&OO课程整体总结
第四单元作业总结 第四单元的作业主题是UML图的解析,通过对UML图代码的解析,我对UML图的结构以及各种元素之间的关系的理解更加深入了. ------------------------------ ...