思路:
每个点被控制之后的贡献都是,所以答案可以转化为求每个点被控制的期望之和。
对每个点计算合法排列(城市的排列),合法排列必须满足存在一个城市能控制点,可以用容斥/状压写,复杂度级别的。
可以考虑求答案的补集,求每个点的非法排列,即所有的城市都不能控制该点,显然第个操作的城市于点的距离应该,第个操作的城市于点的距离应该,乘法计数原理即可。
MyCode:
#include<bits/stdc++.h> using namespace std; const int maxn=5e4+7,mod=998244353 ; int f[maxn][25]; int qpow(int a,int b) { int res(1); while(b) { if(b&1) res=1LL*res*a%mod; a=1LL*a*a%mod; b>>=1; } return res; } int main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int n,m,div=1; cin>>n>>m; for(int i=1;i<=n;++i) { div=1LL*div*i%mod; for(int j=1,x;j<=m;++j){ cin>>x; f[j][x]+=1; } } int ans(0); for(int i=1;i<=m;++i) { int tot(0),tmp(1); for(int j=n;j;--j) tot+=f[i][j+1],tmp=1LL*tmp*tot%mod,tot-=1; ans=(1LL*div-tmp+mod+ans)%mod; } cout<<1LL*ans*qpow(div,mod-2)%mod<<'\n'; return 0; }