ran_qwq
2024-11-16 22:22:25
题面比较抽象,这里写一个较为好理解的题面。
对于一个排列
p ,以下面的方式定义矩阵s 与t :对于任意
1\le x<y\le n 且p_x>p_y ,s_{x,y}=1 ,s_{p_x,p_y}=1 ;t_{y,x}=1 ,t_{p_y,p_x}=1 。没被赋
1 的位置为0 。求使
s=t 的原排列个数。
根据定义知
令
则
若
换句话说,
又因为
把排列视为置换,
先判掉
问题转化为,对于一个长度为
我们从前往后考虑,设
初值:
int n,ans,a[N],b[N],f[N];
void QwQ() {
n=rd(),f[0]=f[1]=1;
for(int i=2;i<=n;i++) f[i]=vadd(f[i-1],vmul(i-1,f[i-2]));
for(int i=1;i<=n;i++) a[i]=rd();
for(int i=1;i<=n;i++) if(a[i]) {
b[i]=b[a[i]]=1;
if(a[a[i]]&&a[a[i]]!=i) return puts("0"),void();
}
wr(f[count(b+1,b+1+n,0)],"\n");
}