提交时间:2025-11-12 21:32:09

运行 ID: 38897

#include<bits/stdc++.h> #define int long long #define fir first #define sec second using namespace std; const int N=55,P=998244353; int n,m,a[N][N],e[N][N],s[N*N],tp,cnt; map<int,vector<pair<int,int>>>mp; int dp[N][N*2]; int qpow(int x,int y) { if(!y)return 1; int z=qpow(x,y/2); if(y%2)return z*z%P*x%P; else return z*z%P; } int niyuan(int x) { return qpow(x,P-2); } int check() { dp[0][N]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=N;j++) { dp[i][j]=0; } for(int j=1;j<=N;j++) { for(int k=1;k<=n;k++) { dp[i][j+e[i][k]]+=dp[i-1][j]; } } } return dp[n][N]; } signed main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; s[++tp]=a[i][j]; mp[a[i][j]].push_back({i,j}); } } sort(s+1,s+1+tp); tp=unique(s+1,s+1+tp)-s-1; memset(e,0,sizeof(e)); for(int i=1;i<=tp;i++) { for(int j=0;j<=mp[s[i]].size();j++) { int x=mp[s[i]][j].fir,y=mp[s[i]][j].sec; e[x][y]=0; } cnt+=check()*s[i]; for(int j=0;j<=mp[s[i]].size();j++) { int x=mp[s[i]][j].fir,y=mp[s[i]][j].sec; e[x][y]=-1; } } cout<<cnt%P*niyuan(qpow(m,n))%P<<"\n"; return 0; }