题解:AT_arc230_d [ARC230D] Min Max Matrix
更好的阅读体验
几步最关键的观察我场上都做出来了,可是为什么就差那么一点点呢!
下文中
翻译一下题目说的条件:每行最大值的最小值,等于每行最小值的最大值。假设这个值为
接下来我们发现如果这个
也就是说,所有合法的矩阵可以通过
考虑容斥:我们现在钦定
假设钦定
这个是难以直接求解的。考虑把
我们把和
至此问题在
#include<bits/stdc++.h>
#define endl '\n'
#define N 206
#define M 100000006
#define MOD 998244353
using namespace std;
inline void add(int &x,int y) {x+=y,x-=x>=MOD?MOD:0;}
inline void dec(int &x,int y) {x+=MOD-y,x-=x>=MOD?MOD:0;}
int n,m,V,fac[M],ifac[M],ans,y[N*N];
int qpow(int x,int y=MOD-2)
{
int ret=1;
for(;y;y>>=1,x=1ll*x*x%MOD)if(y&1)ret=1ll*ret*x%MOD;
return ret;
}
int binom(int x,int y) {return x<y?0:1ll*fac[x]*ifac[y]%MOD*ifac[x-y]%MOD;}
main()
{
scanf("%d%d%d",&n,&m,&V),fac[0]=1;
for(int i=1;i<M;i++)fac[i]=1ll*i*fac[i-1]%MOD;
ifac[M-1]=qpow(fac[M-1]);
for(int i=M-2;~i;i--)
ifac[i]=1ll*(i+1)*ifac[i+1]%MOD;
for(int k=0;k<=n*m;k++)
for(int i=1;i<=n;i++)
{
int sum=(qpow((1ll*qpow(k,i)*qpow(V,n-i)%MOD-qpow((V+1-k+MOD)%MOD,n-i)+MOD)%MOD,m)-
qpow(1ll*qpow(k,i)*qpow(V,n-i)%MOD,m)+MOD)%MOD;
if(i&1)dec(y[k],1ll*sum*binom(n,i)%MOD%MOD);
else add(y[k],1ll*sum*binom(n,i)%MOD%MOD);
}
for(int k=1;k<=n*m;k++)add(y[k],y[k-1]);
if(V<=n*m)ans=y[V];
else {
for(int i=0;i<=n*m;i++)
if((n*m-i)&1)dec(ans,1ll*y[i]*fac[V]%MOD*ifac[V-n*m-1]%MOD*
ifac[V-i]%MOD*fac[V-i-1]%MOD*ifac[i]%MOD*ifac[n*m-i]%MOD);
else add(ans,1ll*y[i]*fac[V]%MOD*ifac[V-n*m-1]%MOD*
ifac[V-i]%MOD*fac[V-i-1]%MOD*ifac[i]%MOD*ifac[n*m-i]%MOD);
}
dec(ans,y[0]);
printf("%d\n",ans);
return 0;
}