思路:
每个点被控制之后的贡献都是,所以答案可以转化为求每个点被控制的期望之和。
对每个点计算合法排列(城市的排列),合法排列必须满足存在一个城市能控制点,可以用容斥/状压写,复杂度级别的。
可以考虑求答案的补集,求每个点的非法排列,即所有的城市都不能控制该点,显然第个操作的城市于点的距离应该,第个操作的城市于点的距离应该,乘法计数原理即可。

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;
}