题目

CF715E Complete the Permutations

做法

先考虑无\(0\)排列的最小花费,其实就是沿着置换交换,花费:\(n-\)环个数,所以我们主要是要求出规定环的个数

考虑连边\(a_i\rightarrow b_i\)(仅非零数有出边),本身形成环的不管(也没办法管),考虑一条除首尾外都不为\(0\),首尾至少有一个\(0\)的链(链),那么还有三类:

\(0\rightarrow0(0(a)\)对应的\(b\)是\(0\)或\(b\)的最终点是\(0)\)

\(0\rightarrow x(0(a)\)对应的\(b\)的终点\(x\)无出边\()\)

\(x\rightarrow 0(x(a)\)对应的\(b\)为\(0\)或\(b\)的最终点是\(0)\)

记这三类为个数\(a\),\(b\),\(a\);且\(b\)和\(c\)所构成的环得通过\(a\)间接接通

\(f_i\)为第二类自己和自己匹配所形成的环个数为\(i\)个的方案数:

\[f_i=\sum\limits_{j=i}^b\begin{bmatrix}j\\i\end{bmatrix}C_b^j(a+b-j)^{\underline {b-i}}
\]

理解:从\(b\)条二类链选出\(j\)条,组成\(i\)个环,剩余的二类链随机匹配,\(x\rightarrow 0\)自己与自己连也是\(x\rightarrow 0\),与一类就形成\(0\rightarrow0\),其实最后剩余的二类链就会形成全部变成一类链,而一类链的数量并不会增多

\(g_i\)为三类的方案数,构造方法更上方相同,理解也一样

最后我们仅剩三类了,此时数量还是\(c\),而其中一些三类得贡献出去给一二类成环,而消耗完了的这些就自己给自己成环就行,一类边最后还要排列一下:

\[h_i=\begin{bmatrix}a\\i\end{bmatrix}a!
\]

我们得到的就是一个三式卷积形式,暴力做

Code

#include<bits/stdc++.h>
typedef int LL;
const LL maxn=309,mod=998244353;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}
return x*f;
}
LL n,a,b,c,d;
LL visit1[maxn],visit[maxn],nxt[maxn],a1[maxn],b1[maxn],ans[maxn],ru[maxn],fac[maxn];
LL f[maxn],g[maxn],h[maxn];
LL strl1[maxn][maxn],C[maxn][maxn],D[maxn][maxn];
void Dfs(LL x){
if(!x) return;
visit1[x]=true;
visit[x]=true;
if(nxt[x]!=x){
if(visit1[nxt[x]]) ++d;
else{
Dfs(nxt[x]); nxt[x]=nxt[nxt[x]];
}
}
visit1[x]=0;
}
int main(){
n=Read();
for(LL i=1;i<=n;++i) a1[i]=Read();
for(LL i=1;i<=n;++i) b1[i]=Read();
for(LL i=1;i<=n;++i) nxt[i]=i;
for(LL i=1;i<=n;++i){
if(a1[i]){
if(a1[i]==b1[i]){
++d; visit[a1[i]]=true;
}
else{
nxt[a1[i]]=b1[i];
}
}
if(b1[i]) ++ru[b1[i]];
}
for(LL i=1;i<=n;++i) if(!visit[i]) Dfs(i);
for(LL i=1;i<=n;++i)
if(!a1[i]){
if(nxt[b1[i]]) ++b;
else ++a;
}else
if(!ru[a1[i]] && !nxt[b1[i]]) ++c; strl1[0][0]=strl1[1][1]=1;
for(LL i=2;i<=n;++i)
for(LL j=1;j<=i;++j)
strl1[i][j]=(strl1[i-1][j-1]+1ll*(i-1)*strl1[i-1][j])%mod;
C[0][0]=1;
for(LL i=1;i<=n;++i){
for(LL j=1;j<=i;++j)
C[i][j]=1ll*(C[i-1][j-1]+C[i-1][j])%mod;
C[i][0]=1;
}
D[0][0]=1;
for(LL i=1;i<=n;++i){
D[i][0]=1;
for(LL j=1;j<=i;++j)
D[i][j]=1ll*D[i][j-1]*(i-j+1)%mod;
}
fac[0]=fac[1]=1;
for(LL i=2;i<=n;++i) fac[i]=1ll*fac[i-1]*i%mod;
for(LL i=0;i<=b;++i)
for(LL j=i;j<=b;++j)
f[i]=(f[i]+1ll*strl1[j][i]*C[b][j]%mod*(a+b-j-1>=0?D[a+b-j-1][b-j]:1)%mod)%mod;
for(LL i=0;i<=c;++i){
for(LL j=i;j<=c;++j)
g[i]=(g[i]+1ll*strl1[j][i]*C[c][j]%mod*(a+c-j-1>=0?D[a+c-j-1][c-j]:1)%mod)%mod;
}
for(LL i=0;i<=a;++i)
h[i]=1ll*strl1[a][i]*fac[a]%mod;
for(LL i=0;i<=n;++i)
for(LL j=0;j<=i;++j)
for(LL k=0;k<=i-j;++k)
ans[i]=(ans[i]+1ll*h[j]*f[k]%mod*g[i-j-k]%mod)%mod;
for(LL i=0;i<n;++i){
if(n-i-d<0) printf("0 ");
else printf("%d ",ans[n-i-d]);
}
return 0;
}

CF715E Complete the Permutations(第一类斯特林数)的更多相关文章

  1. 【CF715E】Complete the Permutations 第一类斯特林数

    题目大意 有两个排列 \(p,q\),其中有一些位置是空的. 你要补全这两个排列. 定义 \(s(p,q)\) 为 每次交换 \(p\) 中的两个数,让 \(p=q\) 的最小操作次数. 求 \(s( ...

  2. 【CF715E】Complete the Permutations(容斥,第一类斯特林数)

    [CF715E]Complete the Permutations(容斥,第一类斯特林数) 题面 CF 洛谷 给定两个排列\(p,q\),但是其中有些位置未知,用\(0\)表示. 现在让你补全两个排列 ...

  3. Codeforces 715E - Complete the Permutations(第一类斯特林数)

    Codeforces 题面传送门 & 洛谷题面传送门 神仙题.在 AC 此题之前,此题已经在我的任务计划中躺了 5 个月的灰了. 首先考虑这个最短距离是什么东西,有点常识的人(大雾)应该知道, ...

  4. 【UVA 11077】 Find the Permutations (置换+第一类斯特林数)

    Find the Permutations Sorting is one of the most used operations in real life, where Computer Scienc ...

  5. UVA11077 Find the Permutations —— 置换、第一类斯特林数

    题目链接:https://vjudge.net/problem/UVA-11077 题意: 问n的全排列中多有少个至少需要交换k次才能变成{1,2,3……n}. 题解: 1.根据过程的互逆性,可直接求 ...

  6. 【HDU 4372】 Count the Buildings (第一类斯特林数)

    Count the Buildings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  7. 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. 如何快速求解第一类斯特林数--nlog^2n + nlogn

    目录 参考资料 前言 暴力 nlog^2n的做法 nlogn的做法 代码 参考资料 百度百科 斯特林数 学习笔记-by zhouzhendong 前言 首先是因为这道题,才去研究了这个玩意:[2019 ...

  9. 【2019雅礼集训】【CF 960G】【第一类斯特林数】【NTT&多项式】permutation

    目录 题意 输入格式 输出格式 思路 代码 题意 找有多少个长度为n的排列,使得从左往右数,有a个元素比之前的所有数字都大,从右往左数,有b个元素比之后的所有数字都大. n<=2*10^5,a, ...

随机推荐

  1. C、C++数据类型所占字节数

    C标准中并没有详细给出规定那个基本类型应该是多少字节数.详细与机器.OS.编译器有关,比方相同是在32bits的操作系统系,VC++的编译器下int类型为占4个字节:而tuborC下则是2个字节. 所 ...

  2. WPF数据验证(4)——响应与获取验证错误

    1780 前面的示例中,有关用户接受到错误的唯一指示是在违反规则的文本框周围的红色轮廓.为了提供更多信息,可以处理 Error 事件,但存储或清除错误时会引发该事件,但前提是必须确保已将 Bindin ...

  3. Oracle体系机构

    Oracle 体系结构1.文件:数据库组成和实例文件;2.系统全局区:SGA内存结构,SGA PGA UGA关,也研究SGA和java池,共享池和大部分的池;3.物理进程和线程 server进程 ba ...

  4. 云计算和SDN中的开源交换机介绍以及使用

    之前关于SDN的开发工作都是在控制器层面上(以ryu为主),现在开始了新的工程项目,需要同时修改控制器和交换机的源码,如果后续项目需要,还可能需要加中间层——网络虚拟层,这部分的知识已经在前面读过了相 ...

  5. Null value was assigned to a property of primitive type setter

    org.springframework.orm.jpa.JpaSystemException: Null value was assigned to a property of primitive t ...

  6. Less-mixin函数基础二

    //mixin函数 基础使用方法 --包含选择器,example: .test(){ &:hover{ border:1px solid red; } } button{ .test; } / ...

  7. Angular ui-route的用法

    ui-router和同属AngularJS框架一部分的ng-route一样强大. ui-router提供了让我们可以做路由嵌套和视图命名的特性,嵌套路由功能主要是依赖$stateProvider服务, ...

  8. Storm的组件

    摘自网上 当时写的很好,很详细的介绍了各个组件直接的关系 Storm集群和Hadoop集群表面上看很类似.但是Hadoop上运行的是MapReduce jobs,而在Storm上运行的是拓扑(topo ...

  9. JavaScript 入门之常见对象

    常见对象 1. Object 对象 2. String 对象 3. Array 对象 4. Date 对象 5. Number 对象 6. 自定义对象 with 语句 为了简化对象调用内容的书写 格式 ...

  10. awesome-modern-cpp

    Awesome Modern C++ A collection of resources on modern C++. The goal is to collect a list of resouce ...