1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| constexpr int N=405;using ll=long long;constexpr ll mod=998244353; inline ll qpow(ll a,ll b) { ll ret=1;a%=mod; while(b) { if(b&1) ret=ret*a%mod; a=a*a%mod; b>>=1; } return ret; } int a[N][N];ll f[N][N]; struct dat{int x,y;}; vector<dat>id[N*N]; ll fac[N<<1],ifac[N<<1]; inline ll abs(ll x){return x<0?-x:x;} inline ll binom(ll n,ll m){return (m<0||n<m)?0:fac[n]*ifac[n-m]%mod*ifac[m]%mod;} inline ll calc(ll x,ll y,ll z,ll w){return binom(z-x+w-y,z-x);} inline void init(const int n) { fac[0]=ifac[0]=1; for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod; ifac[n]=qpow(fac[n],mod-2); for(int i=n-1;i>0;i--) ifac[i]=ifac[i+1]*(i+1)%mod; } inline void work() { ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); int n;cin>>n;init(n*2); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j],id[a[i][j]].emplace_back((dat){i,j}); ll ans=0; for(int i=1;i<=n*n;i++) { if(!id[i].size()) continue; int sz=int(id[i].size()); if(sz<=n) for(int j=0;j<sz;j++) for(int k=0;k<sz;k++) ans=(ans+calc(id[i][j].x,id[i][j].y,id[i][k].x,id[i][k].y))%mod; else { memset(f,0,sizeof(f)); for(const dat&j:id[i]) f[j.x][j.y]=1; for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) f[j][k]=(f[j][k]+f[j-1][k]+f[j][k-1])%mod; for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) if(a[j][k]==i) ans=(ans+f[j][k])%mod; } } cout<<ans<<endl; }
CPP
|