Lysea
2024-11-16 22:19:26
形式化题意:
给定序列
问有多少种排列
为什么可以转化为以上题意呢?
因为
而满足上述要求的无非两种情况:
形式化一点说就是
转换完题目后再看本题,记
若
否则若
否则一定不满足题意,输出
接下来的问题就变为了,对于一个长为
至于这些数是否能与原
明显的计数 dp,令
最终答案:
有个坑点,注意特殊性质 A 中
#include<bits/stdc++.h>
#define int long long
#define N 1000005
#define INF 1e18
using namespace std;
const int M=998244353;
int n,a[N],ans=1,cnt,dp[N][2];
signed main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(!a[i]) cnt++;
}
for(int i=1;i<=n;i++){
if(!a[i]) continue;
if(i!=a[a[i]]){
if(a[a[i]]){
cout<<0;
return 0;
}
cnt--;
}
}
dp[0][0]=dp[1][0]=dp[2][0]=dp[2][1]=1;
for(int i=3;i<=cnt;i++){
dp[i][0]=(dp[i-1][0]+dp[i-1][1])%M;
dp[i][1]=(i-1)*dp[i-1][0]%M;
}
cout<<(dp[cnt][0]+dp[cnt][1])%M;
return 0;
}